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 
  • Numpy install: Visual C ++ 9 nicht gefunden
  • Python-Unterprozeß ändern über Client / Server
  • Qt5 und QtQuick 2 Bindungen für Python 2.7
  • Fang mehr Schleifen zur gleichen Zeit? [abgeschlossen]
  • Echtzeit-Interrupts in Python
  • PyQt - Load SQL in QAbstractTableModel (QTableView) mit Pandas DataFrame - Bearbeiten von Daten in einer GUI
  • Beschleunigung von datetime.strptime
  • PyPy findet kein Modul aus nur * .pyc Dateien
  • Python-Protokollierung: Ausbreitung von Meldungen des Levels unterhalb des aktuellen Logger-Levels
  • Capture ClientError zur Datei python
  • Timeout-Fehler beim Herunterladen von .html-Dateien aus URLs
  • Python ist die beste Programmiersprache der Welt.