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

Posted

技术标签:

【中文标题】Python:总结具有不同键和相同值的字典列表【英文标题】:Python: summing up list of dictionaries with different keys and same values 【发布时间】:2019-08-18 10:52:32 【问题描述】:

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

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

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

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

我查看了similar question,但没能找到答案。 请问有什么建议吗?

【问题讨论】:

你正在寻找一个列表/字典理解? 是的,最好 每个dict 是否只包含一个键值对? 是的,一个键值对 How to sum dict elements的可能重复 【参考方案1】:

在您链接到的问题中有一个答案可以按原样工作:

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

【讨论】:

【参考方案2】:

你可以使用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)

【讨论】:

Counter.update 会在这里做得很好:***.com/a/3491086/1388292 @JacquesGaudin 我怎么会错过呢?!谢谢!已更新。【参考方案3】:

这可以在一行中完成,无需任何导入,使用一些巧妙的归约

要了解其工作原理,您必须了解 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

【讨论】:

以上是关于Python:总结具有不同键和相同值的字典列表的主要内容,如果未能解决你的问题,请参考以下文章

python中集合和字典的区别

Python日总结

python 中关于字典的键

如何在创建列表时将列表存储在字典中,然后将其清除然后用于具有不同值的下一个键?

Python 字典方法

Python 字典方法