2016-12-08 15 views
0

У меня проблема с сочетанными словарями. Имейте так много кода, поэтому я показываю в примере, что моя проблема.Как я могу конкатенировать 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} 

Это prepering wordcounts для wordcloud. Я не знаю, как конкатенировать значения ключей, которые для меня головоломки. Пожалуйста помоги. С наилучшими пожеланиями

+1

Добро пожаловать [так!] Просмотрите [ask] и покажите нам, что вы пробовали! – TemporalWolf

ответ

5

Я хотел бы использовать 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}) 
+0

В настоящее время счетчики, похоже, решают много вопросов диктата! Для этой проблемы я бы сделал 'reduce (lambda x, y: Counter (x) + Counter (y), [d1, d2, d3])'. Является ли update() быстрее/лучше, чем добавление счетчиков? – themistoklik

+0

@themistoklik Вероятно, не сильно, если вообще, и 'сокращение' устарело в python 3. Я изначально написал это с помощью' map (c.update, (d1, d2, d3)) ', но тогда я мой внутренний функционал программист отказался позволить мне злоупотреблять такими побочными эффектами. –

2
import itertools 

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} 
dicts = [d1, d2, d3] 

In [31]: answer = {k:sum(d[k] if k in d else 0 for d in dicts) for k in itertools.chain.from_iterable(dicts)} 

In [32]: answer 
Out[32]: 
{'sequel': 1, 
'the': 10, 
'fine': 16, 
'jimbo': 1, 
'word': 6, 
'orange': 1, 
'knight': 1} 
+0

как насчет «рыцаря», «продолжения», «оранжевого» и «джимбо»? – rassar

+0

@InspectorGadget молодцы! – rassar

+0

omg спасибо nice oneliner :) – MTG

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

например Shell:

>>> 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} 
+0

'if key in summed ...', вероятно, будет лучше, чем 'summed [key] = summed.get (key, 0) + value' –

+0

@SeanMcЧто-то, что не работает на моем компьютере ... говорит, что" t назначить вызов функции « – rassar

+0

Извините, некоторые вещи перепутаны. Исправлено в редактировании. –