0

我有两本词典

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方式来做到这一点?

请注意,我是 python 新手,即使我使用的是 pythonic 之类的词。提前致谢。

4

4 回答 4

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]})
于 2012-09-28T06:15:33.593 回答
3

你确定他们有相同的钥匙吗?你可以这样做:

c = dict( (k,a[k]+b[k]) for k in a )

添加列表连接所以a[k] + b[k]给你类似于[1,2]+[3,4]which equals的东西[1,2,3,4]。构造dict函数可以采用一系列 2 元素迭代,它们变成key-value对。

如果他们不共享密钥,您可以使用sets.

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 )
于 2012-09-28T06:07:24.500 回答
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]})
于 2012-09-28T06:33:20.030 回答
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]}

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

于 2012-09-28T06:08:10.060 回答