python dict.add_by_value(dict_2)?

9 投票
8 回答
2349 浏览
提问于 2025-04-15 11:40

问题:

>>> a = dict(a=1,b=2    )
>>> b = dict(    b=3,c=2)

>>> c = ???

c = {'a': 1, 'b': 5, 'c': 2}

我的想法是通过整数或浮点数的值,以最简洁的方式向字典中添加内容。这里有一个我想出的解决方案,但我不太喜欢,因为它太长了:

c = dict([(i,a.get(i,0) + b.get(i,0)) for i in set(a.keys()+b.keys())])

我觉得应该有更简短、更简洁的解决方案(也许可以用到reduce和operator模块?或者itertools?)……有没有什么想法?


更新:我真的希望能找到更优雅的方式,比如“reduce(operator.add, key=itemgetter(0), a+b)”。(显然这不是实际的代码,但你应该能明白我的意思)。不过这似乎有点不切实际。


更新:我仍在寻找更简洁的解决方案。也许groupby可以帮上忙?我用“reduce”和“groupby”想出的解决方案其实并不简洁:

from itertools import groupby
from operator import itemgetter,add

c = dict( [(i,reduce(add,map(itemgetter(1), v))) \
              for i,v in groupby(sorted(a.items()+b.items()), itemgetter(0))] )

8 个回答

6

在我第一次看到这个问题时,我会这样写:

>>> c = a.copy()
>>> for k in b: c[k] = c.get(k, 0) + b[k]
8

我会从“性能”而不是“长度”来考虑解决问题,具体做法如下:

>>> from collections import defaultdict
>>> def d_sum(a, b):
        d = defaultdict(int, a)
        for k, v in b.items():
            d[k] += v
        return dict(d)
>>> a = {'a': 1, 'b': 2}
>>> b = {'c': 2, 'b': 3}
>>> d_sum(a, b)
{'a': 1, 'c': 2, 'b': 5}

而且这个代码是兼容Python 3的,不像你原来的代码。

9

最简单的方法就是使用一个叫做 Counter 的工具。

>>> from collections import Counter
>>> a = dict(a=1,b=2    )
>>> b = dict(    b=3,c=2)
>>> Counter(a)+Counter(b)
Counter({'b': 5, 'c': 2, 'a': 1})
>>> dict(Counter({'b': 5, 'c': 2, 'a': 1}))
{'a': 1, 'c': 2, 'b': 5}

撰写回答