【问题标题】:how to merge 2 dictionary where the value is strings with same key [duplicate]如何合并2个字典,其中值是具有相同键的字符串[重复]
【发布时间】:2020-04-04 18:51:58
【问题描述】:

我有两本字典。


gen1 = {0: 'RR', 1: 'RR', 2: 'rR', 3: 'rR', 4: 'RR', 5: 'RR', 6: 'rR', 7: 'rR',
      8: 'Rr', 9: 'Rr', 10: 'rr', 11: 'rr', 12: 'Rr', 13: 'Rr', 14: 'rr', 15: 'rr'}


gen2 = {0: 'PP', 1: 'PP', 2: 'PP', 3: 'PP', 4: 'PP', 5: 'PP', 6: 'PP', 7: 'PP',
      8: 'PP', 9: 'PP', 10: 'PP', 11: 'PP', 12: 'PP', 13: 'PP', 14: 'PP', 15: 'PP'}

我想用相同的键连接它们成为

gen3 = {0: 'RRPP', 1: 'RRPP', 2: 'rRPP', 3: 'rRPP', 4: 'RRPP', 5: 'RRPP', 6: 'rRPP', 7: 'rRPP',
        8: 'RrPP', 9: 'RrPP', 10: 'rrPP', 11: 'rrPP', 12: 'RrPP', 13: 'RrPP', 14: 'rrPP', 15: 'rrPP'}

【问题讨论】:

  • 有没有一种情况,gen1 有一个 gen2 没有的键,反之亦然?应该包括那些吗?
  • 先检查是否len(gen1) == len(gen2)

标签: python dictionary


【解决方案1】:

您可以使用带有f-strings 的字典推导来构建一个新字典:

{k:f'{v}{gen2.get(k, "")}' for k,v in gen1.items()}
# {k:'{}{}'.format(v, gen2.get(k, "")) for k,v in gen1.items()} # python versions under 3.6

{0: 'RRPP', 1: 'RRPP', 2: 'rRPP', 3: 'rRPP', 4: 'RRPP', 5: 'RRPP', 6: 'rRPP', 
 7: 'rRPP', 8: 'RrPP', 9: 'RrPP', 10: 'rrPP', 11: 'rrPP', 12: 'RrPP', 13: 'RrPP', 
 14: 'rrPP', 15: 'rrPP'}

【讨论】:

    【解决方案2】:

    听写理解 - 与@yatu 的回答略有不同。这将对来自 gen1 和 gen2 的所有唯一键进行操作 - 如果键仅存在于其中一个字典中,则结果字典将仅具有相应 gen 字典中的值。

    >>> gen1 = {0: 'RR', 1: 'RR', 2: 'rR', 3: 'rR', 4: 'RR', 5: 'RR', 6: 'rR', 7: 'rR', 8: 'Rr', 9: 'Rr', 10: 'rr', 11: 'rr', 12: 'Rr', 13: 'Rr', 14: 'rr', 15: 'rr'}
    >>> gen2 = {0: 'PP', 1: 'PP', 2: 'PP', 3: 'PP', 4: 'PP', 5: 'PP', 6: 'PP', 7: 'PP', 8: 'PP', 9: 'PP', 10: 'PP', 11: 'PP', 12: 'PP', 13: 'PP', 14: 'PP', 15: 'PP'}
    >>> {k: gen1.get(k, '') + gen2.get(k, '') for k in set(list(gen1.keys()) + list(gen2.keys()))}
    {0: 'RRPP',
     1: 'RRPP',
     2: 'rRPP',
     3: 'rRPP',
     4: 'RRPP',
     5: 'RRPP',
     6: 'rRPP',
     7: 'rRPP',
     8: 'RrPP',
     9: 'RrPP',
     10: 'rrPP',
     11: 'rrPP',
     12: 'RrPP',
     13: 'RrPP',
     14: 'rrPP',
     15: 'rrPP'}
    

    【讨论】:

    • 这个解决方案的一个特点是,如果一个键只存在于一个列表中,您将只从结果中获取该列表中的内容。所以使用gen1={0:'AA', 1:'BB'}gen2={0: 'aa'} 你会得到{0: 'AAaa', 1: 'BB'},如果缺少键,这可能不是你想要发生的。
    【解决方案3】:

    如果您确定 gen1gen2 具有完全相同的键,则应该可以:

    gen3 = { k: gen1[k] + gen2[k] for k in gen1 }
    

    【讨论】:

      【解决方案4】:

      yatu 的答案是更好的解决方案,但出于好奇,我认为我会发布另一个解决方案。

      c = {k: gen1[k] + gen2[k] for k in (gen1.keys() & gen2.keys())}
      

      遍历两个键列表中的键。

      【讨论】:

        猜你喜欢
        • 2020-12-18
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多