我有2个词典
a = {'I': [1,2], 'II': [1,2], 'III': [1,2]}
b = {'I': [3,4], 'II': [3,4], 'IV': [3,4]}
我如何合并它们以便得到以下结果
c = merge_dicts(a,b)
其中c是{'I': [1,2,3,4], 'II': [1,2,3,4], 'III': [1,2], 'IV': [3,4]}
有一种好的pythonic方法吗?
请注意,即使我使用像pythonic这样的词,我也是一个蟒蛇新手。 提前谢谢。
答案 0 :(得分:5)
如果您需要所有值:
from itertools import chain
from collections import defaultdict
a = {'I': [1,2], 'II': [1,2], 'IV': [1,2]}
b = {'I': [3,4], 'II': [3,4], 'V': [3,4]}
d = defaultdict(list)
for key, value in chain(a.iteritems(), b.iteritems()):
d[key].extend(value)
d
输出:
defaultdict(<type 'list'>, {'I': [1, 2, 3, 4], 'II': [1, 2, 3, 4], 'V': [3, 4], 'IV': [1, 2]})
答案 1 :(得分:3)
你确定他们有相同的钥匙吗?你可以这样做:
c = dict( (k,a[k]+b[k]) for k in a )
添加列表连接,a[k] + b[k]
为您提供[1,2]+[3,4]
等于[1,2,3,4]
的内容。 dict
构造函数可以采用一系列2元素迭代,转换为key
- value
对。
如果他们不共享密钥,您可以使用set
s。
aset = set(a)
bset = set(b)
common_keys = aset & bset
a_only_keys = aset - bset
b_only_keys = bset - aset
c = dict( (k,a[k]) for k in a_only_keys )
c.update( (k,b[k]) for k in b_only_keys )
c.update( (k,a[k]+b[k]) for k in common_keys )
答案 2 :(得分:2)
>>> from collections import Counter
>>> class ListAccumulator(Counter):
... def __missing__(self, key):
... return []
...
>>> a = {'I': [1,2], 'II': [1,2], 'III': [1,2]}
>>> b = {'I': [3,4], 'II': [3,4], 'IV': [3,4]}
>>>
>>> ListAccumulator(a) + ListAccumulator(b)
Counter({'IV': [3, 4], 'I': [1, 2, 3, 4], 'II': [1, 2, 3, 4], 'III': [1, 2]})
答案 3 :(得分:1)
>>> a = {'I': [1,2], 'II': [1,2]}
>>> b = {'I': [3,4], 'II': [3,4]}
>>> {key:a[key]+b[key] for key in a}
{'I': [1, 2, 3, 4], 'II': [1, 2, 3, 4]}
请注意,这只有在他们完全共享密钥时才有效。