使用嵌套数组合并两个词典

时间:2012-09-28 06:05:22

标签: python arrays dictionary

我有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这样的词,我也是一个蟒蛇新手。 提前谢谢。

4 个答案:

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

请注意,这只有在他们完全共享密钥时才有效。