通过相同的键合并两个字典

26

我有以下两个玩具字典

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 是否具有相同的键集吗? - cph_sto
根据我的当前需求,在这个例子中是的。当然,如果两个字典中的键集不同,代码也会不同。 - Ric S
5个回答

33

你差一点就做对了,应该使用+将两个列表合并:

{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
该死,是加号,不是逗号。我知道这很简单,但就是没想起来!谢谢。 - Ric S

14

如果d2中的所有键都不在d1中,那么最简单的方法是使用集合并和dict.get

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

10

你可以使用扩展的可迭代解包

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]}

5
你可以使用 itertools.chain 来高效地从输入列表构建一个单独的列表:
from itertools import chain
d_comb = {key: list(chain(d1[key], d2[key])) for key in d1}

对于涵盖任意数量字典和键不相等的更一般情况,请参见在Python中合并字典值列表


4
代码将会运行,无论或是否拥有相同的键。我已经在中添加了一个键和在中添加了一个键。
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 Fabré
感谢Maarten的反馈,非常感激。我已经相应地更改了代码,并使用了您的表达方式,这样更加简洁明了。 - cph_sto
常见的键可以表示为 d2.keys() & d1.keys() - Maarten Fabré
非常感谢Maarten。非常有帮助。我学到了东西 :) - cph_sto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接