这可以在一行中完成,无需任何导入,使用一些巧妙的归约
要了解其工作原理,您必须了解 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}