Wie kombiniere ich mehrere Dicts, summiere die Werte der gemeinsamen Tasten (und behalte die mit Wert 0) in Python?

Bei drei dicts d1, d2 und d3:

D1

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

D2

 {'b':76} 

D3

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

Es gibt einige Schlüsselnamen, die mehr als einem Dict gemeinsam sind (und in Wirklichkeit werden sie das gleiche Real-Life-Objekt repräsentieren). Andere wie 'd' in d1 existieren nur in d2. Ich möchte alle Dicts zusammen gruppieren, zuerst summiere die Werte der gemeinsamen Schlüssel zuerst, am Ende mit:

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

Wenn jeder Dict die gleiche Größe hatte und die gleichen Schlüssel enthielt, konnte ich so etwas machen:

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

Aber das wird brechen, sobald es einen Schlüssel erreicht, der in d1 ist, aber nicht in den anderen. Wie erreichen wir das?

AKTUALISIEREN

Kein Duplikat Sammlungen.Counter fast funktioniert, aber der Schlüssel d fehlt aus dem resultierenden Zähler, wenn der Wert von Schlüssel d Null ist, was oben ist.

 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 “Wie kombiniere ich mehrere Dicts, summiere die Werte der gemeinsamen Tasten (und behalte die mit Wert 0) in Python?”

Du könntest das update anstelle von + mit Counter wenn die 0 Schlüssel bestehen bleiben sollen:

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

(Das ist wohl ein Dup, aber ich kann es jetzt nicht finden.)

UNGETESTET:

 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 

Beispiel:

 merge_dicts(d1, d2, d3) 

collections.defaultdict zur Rettung

 import collections d = collections.defaultdict(int) for thing in [d1, d2, d3]: for k, v in thing.items(): d[k] += v 
  • Unicode-Daten in csv schreiben
  • Python: Überschreiben Sie den Import von Numpy von Abaqus mit einer anderen Version von numpy
  • Python install lxml auf mac os 10.10.1
  • Ändern Sie das Zeichen aus seiner Position? Python 2.7
  • Openpyxl-Diagrammfehlerbalkenstile
  • Wie kann man eine Datei mit Python aufheben
  • Timeout-Fehler beim Herunterladen von .html-Dateien aus URLs
  • Wie man Piping-Ausgabe eines Programms auf ein Python-Skript, wenn das Programm neu gestartet wird
  • Wie man das richtige Regex-Format zum Suchen und Ersetzen von Zeilen in einer Datei schreibt
  • Wie bindet man Strg + / in python tkinter?
  • Überprüfen, ob zwei massive Python-Wörterbücher äquivalent sind
  • Python ist die beste Programmiersprache der Welt.