2015-02-21 7 views
7

Ich habe zwei Python-Wörterbücher, die ich versuche, die Werte zusammen zu summieren. Die Antwort in: Is there any pythonic way to combine two dicts (adding values for keys that appear in both)? bekommt mich am meisten. Allerdings habe ich Fälle, in denen die Nettowerte Null oder negativ sein können, aber ich möchte immer noch die Werte im endgültigen Wörterbuch. Auch wenn Zähler negative Werte akzeptieren, wird nur ein Wert ausgegeben, wenn dieser größer als Null ist.kombiniert zwei Python-Wörterbücher zu einem, wenn die Nettowerte nicht positiv sind

Beispiel

from collections import Counter 
A = Counter({'a': 1, 'b': 2, 'c': -3, 'e': 5, 'f': 5}) 
B = Counter({'b': 3, 'c': 4, 'd': 5, 'e': -5, 'f': -6}) 
C = A + B 
print(C.items()) 

Ausgang: [('a', 1), ('c', 1), ('b', 5), ('d', 5)]

c = -3 + 4 = 1 korrekt ist, so ist der negativer Eingang ist kein Problem, aber e: 0 und f: -1 vom Ausgang fehlt

Wie kann Ich führe die Summierung durch und bekomme alle Werte ausgegeben?

+0

Sie benötigen eine Schleife über eindeutige sortierte kombinierte Schlüssel – Skaperen

Antwort

4

Wie wäre es so etwas wie:

dict((x, a.get(x, 0) + b.get(x, 0)) for x in set(a)|set(b)) 

Beispiel:

>>> a = {'a':1, 'b':2, 'c':-3, 'e':5, 'f': 5} 
>>> b = {'b':3, 'c':4, 'd':5, 'e':-5, 'f': -6} 
>>> 
>>> dict((x, a.get(x, 0) + b.get(x, 0)) for x in set(a)|set(b)) 
{'e': 0, 'a': 1, 'f': -1, 'd': 5, 'c': 1, 'b': 5} 
+0

Dies erzeugt jedoch kein neues 'Counter()' -Objekt. –

+2

War das erforderlich? Nach meinem Verständnis bestand das Ziel darin, nur zwei Wörterbücher hinzuzufügen. Aber wahr, es tut es nicht. – Roope

+0

speziell mit einem Zähler als die Ausgabe ist keine Voraussetzung. Am Ende gebe ich nur die Endergebnisse in eine Datei aus. Das funktioniert. Die Zähler waren nur ein Mittel, um das Wörterbuch, das ich in dem referenzierten Beitrag gefunden habe, hinzuzufügen. Danke – user3314562

7

Summieren fällt Werte bei 0 und niedriger, ja, wie dokumentiert:

Mehrere mathematische Operationen vorgesehen sind Kombinieren von Counter-Objekten zum Erzeugen von Multisets (Counter, die Counts größer als Null haben). Addition und Subtraktion kombinieren Zähler durch Addieren oder Subtrahieren der Zählerstände der entsprechenden Elemente. Schnittpunkt und Vereinigung geben das Minimum und Maximum der entsprechenden Zählungen zurück. Jeder Vorgang kann Eingaben mit vorzeichenbehafteten Zählwerten annehmen, , aber die Ausgabe schließt Ergebnisse mit Zählwerten von null oder weniger aus.

[...]

  • Die multiset Methoden entwickelt werden nur für Anwendungsfälle mit positiven Werten. Die Eingänge können negativ oder Null sein, aber Nur Ausgänge mit positiven Werten werden erstellt. Es gibt keine Typeinschränkungen, aber der Wertetyp muss Addition, Subtraktion und Vergleich unterstützen.

Sie werden Counter.update() verwenden müssen, wenn Sie die Werte bei 0 oder niedriger halten wollte. Da dies ein an Ort und Stelle ist, den Betrieb finden Sie hier eine Kopie erstellen müssen:

>>> from collections import Counter 
>>> A = Counter({'a': 1, 'b': 2, 'c': -3, 'e': 5, 'f': 5}) 
>>> B = Counter({'b': 3, 'c': 4, 'd': 5, 'e': -5, 'f': -6}) 
>>> C = A.copy() 
>>> C.update(B) 
>>> C 
Counter({'b': 5, 'd': 5, 'a': 1, 'c': 1, 'e': 0, 'f': -1}) 

Wenn A Erhaltung kein Ziel ist, können Sie es einfach direkt aktualisieren.

+0

Warum verhält sich 'Counter()' beim Summieren negativer Zähler so? es fühlt sich ziemlich unerwartet an, nicht die Python, die ich kenne und bewundere ... –

+1

@Chris_Rands, weil Counter multi Sets sind; ein Satz, der sowohl die Mitgliedschaft als auch eine Zählung behandelt, wie oft er Teil des Sets ist. 0 (oder niedriger) bedeutet, dass es nicht länger Teil des Sets ist, also entfernt wird. –

+0

Danke, das macht Sinn. Weiterer Gedanke, in Python 3.5+ können Sie 'dict's mit' {** A, ** B} 'kombinieren, aber das funktioniert nicht mit' Counter (** A, ** B) ' –

Verwandte Themen