Это можно сделать в одной строке без какого-либо импорта, используя некоторое умное сокращение
Чтобы понять, как это работает, вы должны понять, как работает 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}