我有以下两个玩具字典
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]}
如何用一行或两行代码做到这一点?
答案 0 :(得分:30)
您几乎拥有了它,而是使用+
附加了两个列表:
{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]}
答案 1 :(得分:12)
如果不是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}
答案 2 :(得分:9)
您可以使用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]}
答案 3 :(得分:4)
无论d1
或d2
具有相同的键集,该代码都将起作用。我在'e'
中添加了密钥d1
,在'd'
中添加了d2
。
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]}
答案 4 :(得分:3)
您可以使用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。