Как суммировать dict элементы

В Python у меня есть список dicts:

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

Я хочу один финал dict, который будет содержать сумму всего dicts. Т.е. результат будет: {'a':5, 'b':7}

N.B: каждый dict в списке будет содержать то же количество ключа, пар значения.

36
задан sth 16 August 2010 в 05:24
поделиться

6 ответов

Немного некрасиво, но однострочно:

dictf = reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.iteritems()), dict1)
16
ответ дан 27 November 2019 в 05:27
поделиться

Это может помочь:

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}
8
ответ дан 27 November 2019 в 05:27
поделиться

Следующий код показывает один из способов сделать это:

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: -)

5
ответ дан 27 November 2019 в 05:27
поделиться

Вы можете использовать collections.Counter

counter = collections.Counter()
for d in dict1: 
    counter.update(d)

Или, если вы предпочитаете oneliners:

functools.reduce(operator.add, map(collections.Counter, dict1))
45
ответ дан 27 November 2019 в 05:27
поделиться

Использование 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, предложенная Стефаном, читается очень хорошо

11
ответ дан 27 November 2019 в 05:27
поделиться

В Python 2.7 вы можете заменить dict объектом collections.Counter. Это поддерживает сложение и вычитание счетчиков.

1
ответ дан 27 November 2019 в 05:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: