Как объединить несколько dicts, суммируя значения общих ключей (и сохраняя значения со значением 0) в Python?

Учитывая три слова d1, d2 и d3:

d1

{'a':1,'b':2,'c':3, 'd':0) 

d2

 {'b':76} 

d3

 {'a': 45, 'c':0} 

Есть несколько ключевых имен, которые являются общими для более чем одного dict (и в действительности они будут представлять один и тот же объект реальной жизни). Другие, такие как 'd' в d1, существуют только в d2. Я хочу сгруппировать все dicts вместе, сначала сначала суммируя значения общих ключей, заканчивая:

 {'a':46, 'b':78, 'c':3, 'd': 0} 

Если бы каждый диктофон имел одинаковый размер и содержал одни и те же ключи, я мог бы сделать что-то вроде:

 summedAndCombined = {} for k,v in d1.items(): summedAndCombined[k] = d1[k]+d2[k]+d3[k] 

Но это сломается, как только он достигнет ключа, который находится в d1, но не в других. Как мы это достигаем?

ОБНОВИТЬ

Не дубликат. collections.Counter почти работает, но ключ d отсутствует в результирующем счетчике, если значение ключа d равно нулю, а это выше.

 In [128]: d1 = {'a':1,'b':2,'c':3, 'd':0} In [129]: d2 = {'b':76} In [130]: d3 = {'a': 45, 'c':0} In [131]: from collections import Counter In [132]: Counter(d1) + Counter(d2) + Counter(d3) Out[132]: Counter({'b': 78, 'a': 46, 'c': 3}) 

3 Solutions collect form web for “Как объединить несколько dicts, суммируя значения общих ключей (и сохраняя значения со значением 0) в Python?”

Вы можете использовать update вместо + с помощью Counter если вы хотите, чтобы клавиши 0 сохранялись:

 >>> c = Counter() >>> for d in d1, d2, d3: ... c.update(d) ... >>> c Counter({'b': 78, 'a': 46, 'c': 3, 'd': 0}) 

(Это, вероятно, дубликат, но я не могу найти его прямо сейчас.)

UNTESTED:

 def merge_dicts(*dicts): res = {} for key in set(sum(map(list, dicts), [])): res[key] = 0 for dct in dicts: res[key] += dct.get(key, 0) return res 

Пример использования:

 merge_dicts(d1, d2, d3) 

collections.defaultdict для спасения

 import collections d = collections.defaultdict(int) for thing in [d1, d2, d3]: for k, v in thing.items(): d[k] += v 
  • Использование серии для вычисления pi в Python
  • как я могу сделать функцию защиты штыря для банкомата
  • Передача данных через классы Tkinter
  • Можете ли вы искать назад от смещения, используя регулярное выражение Python?
  • Как написать несколько условий if-statement в структуре робота
  • получение данных из .txt-файла с помощью python?
  • Вставьте Pandas Dataframe в mongodb, используя PyMongo
  • virtualenv не копирует все .py-файлы из каталога lib / python
  • Python 2.7 Комбинируйте abc.abstractmethod и classmethod
  • Наследование Python super __init__
  • Ошибка импорта для Oauth
  •  
    Interesting Posts for Van-Lav

    Как суммировать список чисел, хранящихся в виде строк

    Как написать отдельные биты в текстовый файл в python?

    Pandas, конвертировать столбец из юникодов в столбец списка строк

    Django Rest Framework 3.4. Сериализация внешнего ключа и загрузка файла изображения

    Отладчик Python работает в генераторах?

    Python и threading: почему «большой» объект списка теряется при обращении от другого метода?

    Не удается войти в rosetta

    Разбор S-выражений в Python

    Как установить одно-многое и одно отношение в одно и то же время в Flask-SQLAlchemy?

    Флажок jsonify список объектов

    Python: переключение на один словарь и создание пар ключ / значение в новом словаре, если условия встречаются

    Как указать диапазон символов Unicode в регулярном выражении в python?

    Нумеровое первое значение значения больше существующего значения

    Что делать? R в str () и repr ()?

    Бинарные файлы HTTP POST с использованием Python: краткие примеры не-pycurl?

    Python - лучший язык программирования в мире.