Python:总结具有不同键和相同值的字典列表

时间:2019-03-27 18:51:08

标签: python dictionary sum

我有以下具有不同键和值的词典列表。每个词典只有一对键值对。

[{'a':1}, {'b':1}, {'a':1}, {'b':2}]

我需要以下输出,最好使用列表/字典理解

[{'a': 2, 'b': 3}]

我看了一个similar question,但并不幸运地发现了这一点。 有什么建议吗?

3 个答案:

答案 0 :(得分:4)

您所链接的问题中有一个答案按原样起作用:

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

final = {}
for d in dict1:
    for k in d.keys():
        final[k] = final.get(k,0) + d[k]

print (final)

收益:

{'a': 2, 'b': 3}

答案 1 :(得分:4)

您可以使用collections.Counter

from collections import Counter

lst = [{'a':1}, {'b':1}, {'a':1}, {'b':2}]

c = Counter()

for dct in lst: 
    c.update(dct)

print(c)
# Counter({'b': 3, 'a': 2})

答案 2 :(得分:2)

这可以通过单行完成,而无需进行任何巧妙的减少操作

要了解其工作原理,您必须了解reduce的工作原理。从本质上讲,它允许您定义一个操作,该操作从列表中获取两个元素并将它们简化为单个元素。然后,它将此操作递归应用于您的列表,直到列表被简化为单个元素。这是单行版本:

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

print(reduce(lambda a, b: {k: a.setdefault(k, 0) + b.setdefault(k, 0) for k in set(a.keys()).union(b.keys())}, dict1))

在这种情况下,该操作定义为:

lambda a, b: 
        {k: a.setdefault(k, 0) + b.setdefault(k, 0) for k in (set(a.keys()).union(b.keys()))}

也可以表示为:

# a and b are two elements from the list. In this case they are dictionaries
def combine_dicts(a, b):
    output = {}
    for k in set(a.keys()).union(b.keys()): # the union of the keys in a and b
        output[k] = a.setdefault(k, 0) + b.setdefault(k, 0)
        # dict.setdefault returns the provided value if the key doesn't exist
    return output

将此操作应用于带有reduce的列表时,您将获得所需的输出:

>>> {'b': 3, 'a': 2}