在Python中"添加"字典?

30 投票
4 回答
24430 浏览
提问于 2025-04-15 12:26

可能重复的问题:
python dict.add_by_value(dict_2) ?

我有两个字典,它们的键是字符串,值是整数。我想把这两个字典合并,结果应该包含所有输入字典的键,而对应的值则是输入字典中相同键的值相加的结果。

为了更清楚,如果某个键只出现在一个字典中,那么这个键和它的值会出现在结果中;如果这个键在两个字典中都有,那么结果中就会显示这两个字典中该键的值相加的结果。

举个例子,假设我的输入是:

a = dict()
a['cat'] = 1
a['fish'] = 10
a['aardvark'] = 1000

b = dict()
b['cat'] = 2
b['dog'] = 200
b['aardvark'] = 2000

我希望得到的结果是:

{'cat': 3, 'fish': 10, 'dog': 200, 'aardvark': 3000}

我知道用Python应该有一种简单的方法可以做到这一点(其实不一定非要一行代码...)。有什么想法吗?

4 个回答

15

a 中的结果:

for elem in b:
    a[elem] = a.get(elem, 0) + b[elem]

c 中的结果:

c = dict(a)
for elem in b:
    c[elem] = a.get(elem, 0) + b[elem]
15

不是一行代码,而是...

import itertools
import collections
a = dict()
a['cat'] = 1
a['fish'] = 10
a['aardvark'] = 1000
b = dict()
b['cat'] = 2
b['dog'] = 200
b['aardvark'] = 2000
c = collections.defaultdict(int)
for k, v in itertools.chain(a.iteritems(), b.iteritems()):
    c[k] += v

你可以很简单地把它扩展到更多的字典。

51

这样怎么样:

dict( [ (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) ] )

或者不创建一个中间列表(生成器就够了):

dict( (n, a.get(n, 0)+b.get(n, 0)) for n in set(a)|set(b) )

附言:

正如一位评论者正确指出的,有一种方法可以更简单地实现这个功能,那就是使用新的(从Py2.7开始)collections.Counter类。根据我记得的,当我写这个答案的时候,这个版本还没有推出:

from collections import Counter
dict(Counter(a)+Counter(b))

撰写回答