如何对字典元素求和

43 投票
11 回答
71341 浏览
提问于 2025-04-16 02:50

在Python中,

我有一个字典的列表:

dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]

我想要一个最终的字典,这个字典会包含所有字典的总和。

也就是说,结果会是:{'a':5, 'b':7}

注意:列表中的每个字典都会包含相同数量的键值对。

11 个回答

13

使用 sum() 函数在合并多个字典时,性能会更好,特别是当字典数量超过几个的时候。

>>> dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
>>> from operator import itemgetter
>>> {k:sum(map(itemgetter(k), dict1)) for k in dict1[0]}        # Python2.7+
{'a': 5, 'b': 7}
>>> dict((k,sum(map(itemgetter(k), dict1))) for k in dict1[0])  # Python2.6
{'a': 5, 'b': 7}

这里加上Stephan的建议。

>>> {k: sum(d[k] for d in dict1) for k in dict1[0]}            # Python2.7+
{'a': 5, 'b': 7}
>>> dict((k, sum(d[k] for d in dict1)) for k in dict1[0])      # Python2.6
{'a': 5, 'b': 7}

我觉得Stephan的Python2.7代码写得非常好。

61

你可以使用 collections.Counter 这个工具。

counter = collections.Counter()
for d in dict1: 
    counter.update(d)

或者,如果你喜欢用一行代码来写:

functools.reduce(operator.add, map(collections.Counter, dict1))
18

虽然有点丑,但这是一行代码:

dictf = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), dict1)

撰写回答