Суммировать соответствующие элементы из нескольких словарей python

У меня есть произвольное количество словарей python равной длины с соответствующими наборами ключей, например:

{'a':1, 'b':4, 'c':8, 'd':9} {'a':2, 'b':3, 'c':2, 'd':7} {'a':0, 'b':1, 'c':3, 'd':4} ... 

Как я могу получить один словарь с одним и тем же набором ключей, но со значениями в виде сумм соответствующих элементов в наборе словарей? Другими словами, я бы хотел:

 {'a':3, 'b':8, 'c':13, 'd':20} 

Может быть, есть уродливая, сложная структура цикла, но есть ли более хороший способ сделать это с помощью какой-то умности понимания списка / диктата? Подумайте об этом, я действительно не уверен, как сделать уродливую версию цикла.

  • Как закрепить два списка списков в Python?
  • Как распаковать файл в Python на всех ОС?
  • Распаковка файлов в python
  • Zip с выводом списка вместо кортежа
  • Функция для создания zip-файла в памяти и возврата в виде ответа HTTP
  • Есть ли библиотека для извлечения файла из удаленного почтового индекса?
  • Замена динамических файлов в App Engine (Python)
  • Почему x, y = zip (* zip (a, b)) работают в Python?
  • 2 Solutions collect form web for “Суммировать соответствующие элементы из нескольких словарей python”

    collections.Counter() на помощь 😉

     from collections import Counter dicts = [{'a':1, 'b':4, 'c':8, 'd':9}, {'a':2, 'b':3, 'c':2, 'd':7}, {'a':0, 'b':1, 'c':3, 'd':4}] c = Counter() for d in dicts: c.update(d) 

    Затем:

     >>> print c Counter({'d': 20, 'c': 13, 'b': 8, 'a': 3}) 

    Или вы можете изменить его на dict:

     >>> print dict(c) {'a': 3, 'c': 13, 'b': 8, 'd': 20} 

    Для Counter() не имеет значения, имеют ли все входные dicts одинаковые ключи. Если вы точно знаете, что они делают, вы можете попробовать смешно 😉 однострочные:

     d = {k: v for k in dicts[0] for v in [sum(d[k] for d in dicts)]} 

    Counter() более четкий, быстрый и гибкий. Справедливости ради, однако, этот чуть менее смешной однострочный шрифт менее смехотворен:

     d = {k: sum(d[k] for d in dicts) for k in dicts[0]} 

    Если вы просто хотите использовать только dict , вы можете использовать это

     dicts = [{'a':0, 'b':4, 'c':8, 'd':9}, {'a':0, 'b':3, 'c':2, 'd':7}, {'a':0, 'b':1, 'c':3, 'd':4}] result = {} for myDict in dicts: for key, value in myDict.items(): result.setdefault(key, 0) result[key] += value print result 

    Вывод:

     {'a': 0, 'c': 13, 'b': 8, 'd': 20} 
    Python - лучший язык программирования в мире.