557 Stimmen

Anhängen eines Wörterbuchs an ein Wörterbuch

Ich habe zwei bestehende Wörterbücher, und ich möchte eines davon an das andere "anhängen". Damit meine ich, dass die Schlüssel und Werte des anderen Wörterbuchs in das erste Wörterbuch übernommen werden sollen. Zum Beispiel:

orig = {
   'A': 1,
   'B': 2,
   'C': 3,
}

extra = {
   'D': 4,
   'E': 5,
}

dest = # Something here involving orig and extra

print dest
{
   'A': 1,
   'B': 2,
   'C': 3,
   'D': 4,
   'E': 5
}

Ich denke, dies alles kann durch eine for Schleife (vielleicht?), aber gibt es eine Methode der Wörterbücher oder ein anderes Modul, das mir diese Arbeit erspart? Die aktuellen Wörterbücher, die ich verwende, sind wirklich groß...

783voto

mipadi Punkte 377834

Das können Sie tun

orig.update(extra)

oder, wenn Sie nicht wollen orig geändert werden soll, erstellen Sie zunächst eine Kopie:

dest = dict(orig)  # or orig.copy()
dest.update(extra)

Wenn sich die Schlüssel von extra und orig überschneiden, wird der endgültige Wert von extra übernommen. Zum Beispiel,

>>> d1 = {1: 1, 2: 2}
>>> d2 = {2: 'ha!', 3: 3}
>>> d1.update(d2)
>>> d1
{1: 1, 2: 'ha!', 3: 3}

184voto

Nuno André Punkte 3480

Es gibt zwei Möglichkeiten, ein Wörterbuch zu einem anderen hinzuzufügen:

Update (modifiziert orig an Ort und Stelle)

orig.update(extra)    # Python 2.7+
orig |= extra         # Python 3.9+

Zusammenführen (erstellt ein neues Wörterbuch)

# Python 2.7+
dest = collections.ChainMap(orig, extra)
dest = {k: v for d in (orig, extra) for (k, v) in d.items()}

# Python 3
dest = {**orig, **extra}          
dest = {**orig, 'D': 4, 'E': 5}

# Python 3.9+ 
dest = orig | extra

Vorbehalte

Beachten Sie, dass diese Operationen nicht kommutativ sind. In allen Fällen, Letzteres ist der Gewinner . z.B.

orig  = {'A': 1, 'B': 2}
extra = {'A': 3, 'C': 3}

dest = orig | extra
# dest = {'A': 3, 'B': 2, 'C': 3}

dest = extra | orig
# dest = {'A': 1, 'B': 2, 'C': 3}

Es ist auch wichtig zu beachten, dass erst ab Python 3.7 (und CPython 3.6) dict s bestellt werden. In früheren Versionen kann die Reihenfolge der Einträge im Wörterbuch daher variieren.

33voto

Johnsyweb Punkte 128606

dict.update() Sieht so aus, als würde es tun, was Sie wollen...

>> orig.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}
>>> 

Vielleicht möchten Sie aber auch nicht Ihr Originalwörterbuch aktualisieren, sondern an einer Kopie arbeiten:

>>> dest = orig.copy()
>>> dest.update(extra)
>>> orig
{'A': 1, 'C': 3, 'B': 2}
>>> dest
{'A': 1, 'C': 3, 'B': 2, 'E': 5, 'D': 4}

29voto

Andrew Clark Punkte 193562

Angenommen, Sie möchten nicht ändern orig können Sie entweder ein Kopieren und Aktualisieren wie bei den anderen Antworten durchführen, oder Sie können ein neues Wörterbuch in einem Schritt erstellen, indem Sie alle Elemente aus beiden Wörterbüchern in den dict-Konstruktor übergeben:

from itertools import chain
dest = dict(chain(orig.items(), extra.items()))

Oder ohne itertools:

dest = dict(list(orig.items()) + list(extra.items()))

Beachten Sie, dass Sie nur das Ergebnis von items() in list() unter Python 3, unter 2.x dict.items() gibt bereits eine Liste zurück, so dass Sie einfach dict(orig.items() + extra.items()) .

Ein allgemeinerer Anwendungsfall ist, dass Sie eine größere Liste von Dicts haben, die Sie zu einem einzigen Dict zusammenfassen möchten, z. B. so:

from itertools import chain
dest = dict(chain.from_iterable(map(dict.items, list_of_dicts)))

20voto

jkdev Punkte 10324

Ein Dreizeiler zum Kombinieren oder Zusammenführen von zwei Wörterbüchern:

dest = {}
dest.update(orig)
dest.update(extra)

Dadurch wird ein neues Wörterbuch erstellt dest ohne Modifikation orig y extra .

Hinweis: Wenn ein Schlüssel unterschiedliche Werte in orig y extra dann extra übersteuert orig .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X