Как я могу объединить dicts (значения в значения одного и того же ключа и нового ключа)?

У меня проблема с объединением словарей. У меня так много кода, поэтому я показываю на примере, в чем моя проблема.

d1 = {'the':3, 'fine':4, 'word':2}
+
d2 = {'the':2, 'fine':4, 'word':1, 'knight':1, 'orange':1}
+
d3 = {'the':5, 'fine':8, 'word':3, 'sequel':1, 'jimbo':1}
=
finald = {'the':10, 'fine':16, 'word':6, 'knight':1, 'orange':1, 'sequel':1, 'jimbo':1}

Подготавливает счетчики слов для wordcloud. Я не знаю, как объединить значения ключей, это для меня загадка. Пожалуйста помоги. С наилучшими пожеланиями


person MTG    schedule 08.12.2016    source источник
comment
Добро пожаловать в Stack Overflow! Просмотрите Как задать вопрос и покажите нам, что вы пробовали!   -  person TemporalWolf    schedule 09.12.2016


Ответы (3)


Я бы использовал для этого Counter от collections.

from collections import Counter

d1 = {'the':3, 'fine':4, 'word':2}
d2 = {'the':2, 'fine':4, 'word':1, 'knight':1, 'orange':1}
d3 = {'the':5, 'fine':8, 'word':3, 'sequel':1, 'jimbo':1}

c = Counter()
for d in (d1, d2, d3):
    c.update(d)
print(c)

Выходы:

Counter({'fine': 16, 'the': 10, 'word': 6, 'orange': 1, 'jimbo': 1, 'sequel': 1, 'knight': 1})
person Patrick Haugh    schedule 08.12.2016
comment
В наши дни счетчики, похоже, решают множество диктовок! Для этой проблемы я бы сделал reduce(lambda x,y:Counter(x)+Counter(y),[d1,d2, d3]). Update () быстрее / лучше, чем добавление счетчиков? - person themistoklik; 09.12.2016
comment
@themistoklik Наверное, не сильно, если вообще, и reduce устарел в python 3. Я изначально писал это с map(c.update, (d1, d2, d3)), но потом я, мой внутренний функциональный программист, отказался позволить мне злоупотреблять такими побочными эффектами. - person Patrick Haugh; 09.12.2016

def sumDicts(*dicts):
    summed = {}
    for subdict in dicts:
        for (key, value) in subdict.items():
            summed[key] = summed.get(key, 0) + value
    return summed

Пример оболочки:

>>> d1 = {'the':3, 'fine':4, 'word':2}
>>> d2 = {'the':2, 'fine':4, 'word':1, 'knight':1, 'orange':1}
>>> d3 = {'the':5, 'fine':8, 'word':3, 'sequel':1, 'jimbo':1}
>>> sumDicts(d1, d2, d3)
{'orange': 1, 'the': 10, 'fine': 16, 'jimbo': 1, 'word': 6, 'knight': 1, 'sequel': 1}
person rassar    schedule 08.12.2016
comment
if key in summed..., вероятно, было бы лучше, если бы summed[key] = summed.get(key, 0) + value - person Sean McSomething; 09.12.2016
comment
@SeanMc Что-то, что не работает на моем компьютере ... говорит, что не может назначить вызов функции - person rassar; 09.12.2016
comment
Извините, кое-что перепутала. Исправлено в редактировании. - person Sean McSomething; 09.12.2016
comment
@SeanMc Что-то исправлено! - person rassar; 09.12.2016

person    schedule
comment
как насчет «рыцаря», «продолжения», «апельсина» и «джимбо»? - person rassar; 09.12.2016
comment
@InspectorGadget молодец! - person rassar; 09.12.2016
comment
Боже, спасибо, хороший лайнер :) - person MTG; 09.12.2016
comment
Почему голос против? - person inspectorG4dget; 09.12.2016