【问题标题】:Merge two dicts by same key [duplicate]通过相同的键合并两个字典[重复]
【发布时间】:2019-06-04 04:06:00
【问题描述】:

我有以下两个玩具字典

d1 = {
 'a': [2,4,5,6,8,10],
 'b': [1,2,5,6,9,12],
 'c': [0,4,5,8,10,21]
 }
d2 = {
 'a': [12,15],
 'b': [14,16],
 'c': [23,35]
  }

我想要一个唯一的字典,我在第一个字典值之后堆叠第二个字典值,在相同的方括号内。

我尝试了以下代码

d_comb = {key:[d1[key], d2[key]] for key in d1}

但我获得的输出在每个键的列表中有两个列表,即

{'a': [[2, 4, 5, 6, 8, 10], [12, 15]],
 'b': [[1, 2, 5, 6, 9, 12], [14, 16]],
 'c': [[0, 4, 5, 8, 10, 21], [23, 35]]}

而我想获得

{'a': [2, 4, 5, 6, 8, 10, 12, 15],
 'b': [1, 2, 5, 6, 9, 12, 14, 16],
 'c': [0, 4, 5, 8, 10, 21, 23, 35]}

我怎样才能用一两行代码做到这一点?

【问题讨论】:

  • 我们确定d1d2 具有相同的密钥集吗?
  • 在这个例子中,根据我目前的需要,是的。当然,我敢肯定,在两个字典中使用不同的键集,代码会有所不同。

标签: python list dictionary


【解决方案1】:

您几乎拥有它,而是使用+ 附加两个列表:

{key: d1[key] + d2[key] for key in d1}

{'a': [2, 4, 5, 6, 8, 10, 12, 15],
 'b': [1, 2, 5, 6, 9, 12, 14, 16],
 'c': [0, 4, 5, 8, 10, 21, 23, 35]}

【讨论】:

  • 该死,这是加号,而不是逗号。我知道这很容易,但没想到!谢谢
【解决方案2】:

如果不是所有来自d2 的键都在d1 中,那么最简单的方法是使用set union 和dict.get

combined_keys = d1.keys() | d2.keys()
d_comb = {key: d1.get(key, []) + d2.get(key, []) for key in combined_keys}

【讨论】:

    【解决方案3】:

    你可以使用extended iterable unpacking:

    d1 = {
     'a': [2,4,5,6,8,10],
     'b': [1,2,5,6,9,12],
     'c': [0,4,5,8,10,21]
     }
    d2 = {
     'a': [12,15],
     'b': [14,16],
     'c': [23,35]
      }
    
    d_comb = {key:[*d1[key], *d2[key]] for key in d1}
    
    print(d_comb)
    

    输出

    {'c': [0, 4, 5, 8, 10, 21, 23, 35], 'b': [1, 2, 5, 6, 9, 12, 14, 16], 'a': [2, 4, 5, 6, 8, 10, 12, 15]}
    

    【讨论】:

      【解决方案4】:

      您可以使用itertools.chain 从输入列表有效地构造单个列表:

      from itertools import chain
      d_comb = {key: list(chain(d1[key], d2[key])) for key in d1}
      

      对于涵盖任意数量的字典和字典之间不相等的键的更一般情况,请参阅Merging dictionary value lists in python

      【讨论】:

        【解决方案5】:

        无论d1d2 是否具有相同的密钥集,该代码都将起作用。我在d1'd'd2 中添加了一个密钥'e'

        d1 = {'a': [2, 4, 5, 6, 8, 10], 'b': [1, 2, 5, 6, 9, 12], 'c': [0, 4, 5, 8, 10, 21], 'e':[0,0,0]}
        d2 = {'a': [12, 15], 'b': [14, 16], 'c': [23, 35], 'd': [13, 3]}
        
        d2_keys_not_in_d1 = d2.keys() - d1.keys()
        d1_keys_not_in_d2 = d1.keys() - d2.keys()
        common_keys = d2.keys() & d1.keys()
        
        for i in common_keys:
            d[i]=d1[i]+d2[i]
        for i in d1_keys_not_in_d2:
            d[i]=d1[i]
        for i in d2_keys_not_in_d1:
            d[i]=d2[i]
        d
        {'a': [2, 4, 5, 6, 8, 10, 12, 15],
         'b': [1, 2, 5, 6, 9, 12, 14, 16],
         'c': [0, 4, 5, 8, 10, 21, 23, 35],
         'd': [13, 3],
         'e': [0, 0, 0]}
        

        【讨论】:

        • 如果d1中有不在d2中的键,则此操作失败,并且d2_keys_not_in_d1 可以更简单地表示为d2.keys() - d1.keys()
        • 感谢 Maarten 的反馈。非常感激。我已经相应地更改了代码并使用了您的表达方式,这更加简洁。
        • 常用键可以表示为`d2.keys() & d1.keys()`
        • 非常感谢马丁。非常有帮助。我学到了一些东西:)
        猜你喜欢
        • 2023-02-06
        • 2014-03-09
        • 2013-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 2019-09-21
        • 2016-06-20
        相关资源
        最近更新 更多