Zum Beispiel habe ich zwei Diktate:
Dict A: {'a': 1, 'b': 2, 'c': 3}
Dict B: {'b': 3, 'c': 4, 'd': 5}
Ich brauche eine pythonische Methode, um zwei Diktate so zu kombinieren, dass das Ergebnis lautet:
{'a': 1, 'b': 5, 'c': 7, 'd': 5}
Das heißt: Wenn ein Schlüssel in beiden Diktaten erscheint, fügen Sie deren Werte hinzu. Wenn er nur in einem Diktat erscheint, behalten Sie seinen Wert bei.
python
dictionary
Derrick Zhang
quelle
quelle
sum(counters)
funktioniert leider nicht.sum()
einen Startwert an, mitsum(counters, Counter())
.+=
Summierung.res = counters[0]
dannfor c in counters[1:]: res += c
.update()
anstelle von+=
:for c in counters[1:]: res.update(c)
.Eine allgemeinere Lösung, die auch für nicht numerische Werte funktioniert:
oder noch allgemeiner:
Zum Beispiel:
quelle
for k in b.viewkeys() & a.viewkeys()
, wenn Python 2.7 und die Schaffung von Sätzen überspringen.set(a)
der Schlüsselsatz eher den Tupelsatz zurück? Was ist der Grund dafür?list({..})
.for k in {...}
usw.operator.mul
klargestellt, dass dieser Code generisch ist und nicht auf das Hinzufügen von Zahlen beschränkt ist.{**a, **b, **{k: op(a[k], b[k]) for k in a.keys() & b}}
sollte in Python 3.5+ funktionieren.quelle
for x in set(itertools.chain(A, B))
nicht logischer? Wie ist die Verwendung von set on dict ein bisschen unsinnig, da Schlüssel bereits eindeutig sind? Ich weiß, es ist nur ein anderer Weg, um einen Satz der Schlüssel zu bekommen, aber ich finde es verwirrender als zu verwendenitertools.chain
(was bedeutet, dass Sie wissen, wasitertools.chain
tut)Intro: Es gibt die (wahrscheinlich) besten Lösungen. Aber Sie müssen es wissen und sich daran erinnern, und manchmal müssen Sie hoffen, dass Ihre Python-Version nicht zu alt ist oder was auch immer das Problem sein könnte.
Dann gibt es die "hackigsten" Lösungen. Sie sind großartig und kurz, aber manchmal schwer zu verstehen, zu lesen und sich zu erinnern.
Es gibt jedoch eine Alternative, zu versuchen, das Rad neu zu erfinden. - Warum das Rad neu erfinden? - Im Allgemeinen, weil es eine wirklich gute Art zu lernen ist (und manchmal nur, weil das bereits vorhandene Tool nicht genau das tut, was Sie möchten und / oder wie Sie es möchten) und die einfachste Art, wenn Sie es nicht wissen oder Ich erinnere mich nicht an das perfekte Werkzeug für Ihr Problem.
Also schlage ich vor, das Rad der
Counter
Klasse aus demcollections
Modul neu zu erfinden (zumindest teilweise):Es gibt wahrscheinlich andere Möglichkeiten, dies zu implementieren, und es gibt bereits Tools, um dies zu tun, aber es ist immer schön zu visualisieren, wie die Dinge im Grunde funktionieren würden.
quelle
quelle
Der ohne zusätzliche Importe!
Es handelt sich um einen pythonischen Standard namens EAFP (leichter um Vergebung zu bitten als um Erlaubnis). Der folgende Code basiert auf diesem Python-Standard .
EDIT: danke an jerzyk für seine verbesserungsvorschläge.
quelle
Counter()
In solchen Fällen ist das Summieren des s definitiv der pythonischste Weg, aber nur, wenn es zu einem positiven Wert führt . Hier ist ein Beispiel und wie Sie sehen können, gibt es keinc
Ergebnis, nachdem derc
Wert desB
Wörterbuchs negiert wurde .Dies liegt daran, dass
Counter
s in erster Linie für die Arbeit mit positiven Ganzzahlen entwickelt wurden, um laufende Zählungen darzustellen (negative Zählungen sind bedeutungslos). Um diese Anwendungsfälle zu unterstützen, dokumentiert Python die Mindesteinschränkungen für Bereich und Typ wie folgt:Um dieses Problem nach dem Summieren Ihres Zählers zu umgehen, können Sie es verwenden
Counter.update
, um die gewünschte Ausgabe zu erhalten. Es funktioniert wiedict.update()
, fügt aber Zählungen hinzu, anstatt sie zu ersetzen.quelle
ODER
Alternativ können Sie Counter verwenden, wie oben von @Martijn erwähnt.
quelle
Für eine allgemeinere und erweiterbarere Methode überprüfen Sie Mergedict . Es verwendet
singledispatch
und kann Werte basierend auf seinen Typen zusammenführen.Beispiel:
quelle
Ab Python 3.5: Zusammenführen und Summieren
Dank @tokeinizer_fsj, der mir in einem Kommentar sagte, dass ich die Bedeutung der Frage nicht vollständig verstanden habe (ich dachte, dass Hinzufügen nur das Hinzufügen von Schlüsseln bedeutet, die sich letztendlich in den beiden Diktarien unterscheiden, und stattdessen die gemeinsamen Schlüsselwerte sollte summiert werden). Also habe ich diese Schleife vor dem Zusammenführen hinzugefügt, sodass das zweite Wörterbuch die Summe der gemeinsamen Schlüssel enthält. Das letzte Wörterbuch ist dasjenige, dessen Werte im neuen Wörterbuch, das das Ergebnis der Zusammenführung der beiden ist, gültig sind. Ich denke, das Problem ist gelöst. Die Lösung ist ab Python 3.5 und den folgenden Versionen gültig.
Wiederverwendbarer Code
quelle
b
ist ,5
(2 + 3), aber Ihre Methode zurückgibt3
.Bitte beachten Sie außerdem, dass
a.update( b )
es 2x schneller ist alsa + b
quelle
Sie könnten dies leicht verallgemeinern:
Dann kann es beliebig viele Diktate dauern.
quelle
Dies ist eine einfache Lösung zum Zusammenführen von zwei Wörterbüchern
+=
, die auf die Werte angewendet werden können. Sie müssen nur einmal über ein Wörterbuch iterierenquelle
Diese Lösung ist einfach zu verwenden, sie wird als normales Wörterbuch verwendet, aber Sie können die Summenfunktion verwenden.
quelle
Wie wäre es mit:
Ausgabe:
quelle
Die oben genannten Lösungen eignen sich hervorragend für Szenarien, in denen Sie eine kleine Anzahl von
Counter
s haben. Wenn Sie eine große Liste von ihnen haben, ist so etwas viel schöner:Die obige Lösung summiert im Wesentlichen das
Counter
s durch:Dies macht das Gleiche, aber ich denke, es hilft immer zu sehen, was es effektiv darunter macht.
quelle
Zusammenführen von drei Dikten a, b, c in einer einzigen Zeile ohne andere Module oder Bibliotheken
Wenn wir die drei Diktate haben
Führen Sie alle mit einer einzigen Zeile zusammen und geben Sie mit ein Diktatobjekt zurück
Rückkehr
quelle
{'a': 9, 'b': 9, 'd': 90}
. Ihnen fehlt die "Summen" -Anforderung.