Zusammenführen und die Summe der beiden Wörterbücher
Habe ich ein Wörterbuch unter, und ich möchte hinzufügen, um ein anderes Wörterbuch mit nicht notwendigerweise verschiedene Elemente und verbinden Sie die Ergebnisse. Gibt es eine eingebaute Funktion dafür, oder muss ich mich um meine eigenen zu machen?
{
'6d6e7bf221ae24e07ab90bba4452267b05db7824cd3fd1ea94b2c9a8': 6,
'7c4a462a6ed4a3070b6d78d97c90ac230330603d24a58cafa79caf42': 7,
'9c37bdc9f4750dd7ee2b558d6c06400c921f4d74aabd02ed5b4ddb38': 9,
'd3abb28d5776aef6b728920b5d7ff86fa3a71521a06538d2ad59375a': 15,
'2ca9e1f9cbcd76a5ce1772f9b59995fd32cbcffa8a3b01b5c9c8afc2': 11
}
Die Anzahl der Elemente im dictionary ist ebenfalls unbekannt.
Wo der merge-Ansicht zwei identische Schlüssel, die Werte dieser Schlüssel summiert werden soll, statt überschrieben.
Bitte Holen Sie sich Ihre Terminologie gerade; das ist ein dict, nicht eine Liste. Auch, welche Art von Ergebnis erwarten Sie, und was haben Sie versucht?
Sie könnte wollen, to Bearbeiten Ihre Frage und sorgen für eine bessere (und richtige) Informationen, oder diese Frage wird wahrscheinlich geschlossen werden.
Sie könnte wollen, to Bearbeiten Ihre Frage und sorgen für eine bessere (und richtige) Informationen, oder diese Frage wird wahrscheinlich geschlossen werden.
InformationsquelleAutor badc0re | 2012-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihnen nicht sagen, wie genau Sie Zusammenführen möchten, so treffen Sie Ihre Wahl:
Ergebnisse:
Ich mochte diesen Ansatz. Aber in meinem Fall, für die gleichen oben Wörterbuch-Werte, ich bin versucht, den Unterschied. ich.e
x-y
.diff= { k: x.get(k, 0) - y.get(k, 0) for k in set(x) | set(y) }
print(diff)
Und das gibt mir :{'only_y': -200, 'both2': -18, 'only_x': 100, 'both1': -9}
ich bin besorgt über dieonly_y
Wert, als es sich um negative200
anstatt Beibehaltung200
. Obwohl Sie bereits eine Antwort auf die eigentliche Frage, könnten Sie bitte vorschlagen, der bessere Weg ist, fangen die negativen Werte für die Schlüssel, die einzigartig sind?wie wäre
sub = lambda a, b: a if b is None else b if a is None else a -b
und dann{k: sub(x.get(k), y.get(k)) for ... etc
InformationsquelleAutor georg
Können Sie durchführen
+
,-
,&
, und|
(intersection und union) aufSammlungen.Counter()
.Also können wir tun, die folgenden (Hinweis: nur positive Werte bleiben im Wörterbuch):
Adresse hinzufügen von Werten, bei denen das Ergebnis null oder negativ verwenden
Counter.update()
für neben-undCounter.subtrahieren()
für die Subtraktion:'both1': 0
imx
undy
und ich will'both1': 0
imz
? Mit dieser Lösung würde es keine'both1'
Schlüssel inz
.Das ist interessant. Blick auf die Sammlungen.Counter () - link, es scheint, dass '+' nur hält positiver Wert zählt (> 0). Aber x ist.update(y) (wobei x,y sind vom Typ Counter) fügt die beiden Objekte sind 0 und der negative Wert zählt. Ich ' ll fügen Sie diese zur Antwort.
Dies ist die pythonic Antwort.
InformationsquelleAutor Scott
Könnten Sie
defaultdict
:Diese produziert
InformationsquelleAutor NPE
Zusätzliche Hinweise basiert auf den Antworten von georg, NPE und Scott.
Ich versuche, diese Aktion auszuführen, die auf Sammlungen von 2 oder mehr Wörterbücher und war daran interessiert, dass die Zeit, die es dauerte, für jeden. Weil ich wollte dies auf eine beliebige Anzahl von Wörterbüchern, musste ich einige der Antworten ein wenig. Wenn jemand bessere Vorschläge für Sie, fühlen Sie sich frei zu Bearbeiten.
Hier ist meine test-Methode. Ich habe aktualisiert es vor kurzem sind tests mit größeren Wörterbüchern:
Erstens ich habe folgende Daten:
Nun werden die einzelnen Methoden:
Außerdem habe ich eine quick-Funktion zu finden, was Unterschiede gab es zwischen den Listen. Leider, das ist, wenn ich das problem gefunden in Scott ' s Methode, nämlich, wenn Sie Wörterbücher, die insgesamt auf 0, wird das Wörterbuch nicht aufgenommen werden, weil, wie
Counter()
verhält, wenn Sie hinzufügen.Schließlich die Ergebnisse:
Ergebnisse: Kleine Tests
Ergebnisse: Große Tests
Natürlich nicht laufen konnte, irgendwo in der Nähe so viele Schleifen
Abschluss
Wichtig. YMMV.
InformationsquelleAutor SCB
Anderen Optionen über eine Funktion reduzieren. Dies ermöglicht, Summe-merge eine willkürliche Sammlung von Wörterbüchern:
Ausführung:
Vorteile:
InformationsquelleAutor Havok
Ich vermute, du suchst
dict
'supdate
Methode:Ich habe auch schon versucht, aber die Ergebnisse nicht die Summe
Du hast Recht.
Ich nahm "merge" in der Frage gleichbedeutend mit update. "sum"—ich nehme an, das bedeutet, man endet mit doppelten Tasten—ist etwas, was Sie nicht tun können, mit einem
dict
. Eine Liste von Tupeln, z.B.[(1,2),(3,4)]
wäre ein Anfang. @DameJovanoski: Sie Bearbeiten müssen, Ihre Frage zu erklären, was Sie wirklich erreichen wollen. Meine schlecht für die raten.Es tut mir Leid für das Durcheinander, ich hatte eine schlechte Nacht gestern 😀
InformationsquelleAutor zigg
Es ist auch Recht einfach Ersatz
dict.update()
:merged = dict(d1, **d2)
InformationsquelleAutor renskiy
Ist operator zu überladen. Mit
__add__
haben wir definiert, wie mit dem operator+
für unseredict_merge
was erbt von der eingebauten pythondict
. Sie können gehen Sie voran und machen Sie es flexibler mit einer ähnlichen Art und Weise zu definieren, anderen Betreibern in der gleichen Klasse z.B.*
mit__mul__
für die Multiplikation, oder/
mit__div__
für die Teilung, oder auch%
mit__mod__
für modulo, und ersetzen die+
imself[key] + other[key]
mit dem jeweiligen Betreiber und, wenn Sie jemals selbst benötigen solche Verschmelzung.Ich habe nur getestet, wie es ist, ohne andere Betreiber, aber ich denke, ein problem mit anderen Operatoren. Einfach lernen durch probieren.
InformationsquelleAutor John Mutuma
Wenn Sie möchten, erstellen Sie eine neue
dict
als|
verwenden:InformationsquelleAutor Bartosz Foder