В Python у меня есть список dicts:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
Я хочу один финал dict, который будет содержать сумму всего dicts. Т.е. результат будет: {'a':5, 'b':7}
N.B: каждый dict в списке будет содержать то же количество ключа, пар значения.
Немного некрасиво, но однострочно:
dictf = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), dict1)
Это может помочь:
def sum_dict(d1, d2):
for key, value in d1.items():
d1[key] = value + d2.get(key, 0)
return d1
>>> dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
>>> reduce(sum_dict, dict1)
{'a': 5, 'b': 7}
Следующий код показывает один из способов сделать это:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
final = {}
for k in dict1[0].keys(): # Init all elements to zero.
final[k] = 0
for d in dict1:
for k in d.keys():
final[k] = final[k] + d[k] # Update the element.
print final
Это выводит:
{'a': 5, 'b': 7}
по вашему желанию.
Или, как подсказывает Крисс, лучше, но все же читабельно:
dict1 = [{'a':2, 'b':3},{'a':3, 'b':4}]
final = {}
for d in dict1:
for k in d.keys():
final[k] = final.get(k,0) + d[k]
print final
Я тоскую по дням оригинального читабельного Python: -)
Вы можете использовать collections.Counter
counter = collections.Counter()
for d in dict1:
counter.update(d)
Или, если вы предпочитаете oneliners:
functools.reduce(operator.add, map(collections.Counter, dict1))
Использование sum()
должно повысить производительность при добавлении более чем нескольких dicts
>>> 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}
добавление предложения Стефана
>>> {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}
Я думаю, что версия кода Python2.7, предложенная Стефаном, читается очень хорошо
В Python 2.7 вы можете заменить dict объектом collections.Counter. Это поддерживает сложение и вычитание счетчиков.