2016-12-08 2 views
0

J'ai un problème avec la concaténation des dictionnaires. J'ai tellement de code que je montre dans l'exemple quel est mon problème.Comment concaténer des dicts (valeurs aux valeurs de la même clé et de la nouvelle clé)?

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} 

Il prépare des comptages de mots pour wordcloud. Je ne sais pas comment concaténer les valeurs des clés c'est un puzzle pour moi. S'il vous plaît aider. Meilleures salutations

+1

Bienvenue sur [si]! S'il vous plaît examiner [demander] et nous montrer ce que vous avez essayé! – TemporalWolf

Répondre

5

Je voudrais utiliser un Counter de collections pour cela.

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) 

Sorties:

Counter({'fine': 16, 'the': 10, 'word': 6, 'orange': 1, 'jimbo': 1, 'sequel': 1, 'knight': 1}) 
+0

Les compteurs semblent résoudre beaucoup de questions dictées ces jours-ci! Pour ce problème je ferais 'réduire (lambda x, y: Compteur (x) + Compteur (y), [d1, d2, d3])'. Update() est-il plus rapide/meilleur que l'ajout des compteurs? – themistoklik

+0

@themistoklik Probablement pas beaucoup, voire pas du tout, et 'réduire' est déprécié en python 3. J'avais à l'origine écrit cela avec' map (c.update, (d1, d2, d3)) ', mais alors mon fonctionnement interne programmeur a refusé de me permettre d'abuser des effets secondaires comme ça. –

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

que dire de «chevalier», «suite», «orange» et «jimbo»? – rassar

+0

@InspectorGadget bien fait! – rassar

+0

omg merci 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 

exemple 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

'si la clé en somme ...' serait probablement mieux comme 'summed [clé] = summed.get (clé, 0) + valeur' –

+0

@SeanMcQuelque chose qui ne fonctionne pas sur mon ordinateur ... dit" peut " t assigner à l'appel de fonction " – rassar

+0

Désolé, certaines choses ont été mélangées. Fixé en édition. –