d3 = dict(d1, **d2)
Ich verstehe, dass dies das Wörterbuch zusammenführt. Aber ist es einzigartig? Was ist, wenn d1 den gleichen Schlüssel wie d2 hat, aber einen anderen Wert? Ich möchte, dass d1 und d2 zusammengeführt werden, aber d1 hat Priorität, wenn es einen doppelten Schlüssel gibt.
python
dictionary
TIMEX
quelle
quelle
**
Übergabe von Schlüsselwortargumenten angesehen wird, es sei denn, alle Schlüssel vond2
sind Zeichenfolgen. Wenn nicht alle Schlüssel vond2
Zeichenfolgen sind, schlägt dies in Python 3.2 und in alternativen Implementierungen von Python wie Jython, IronPython und PyPy fehl. Siehe beispielsweise mail.python.org/pipermail/python-dev/2010-April/099459.html .Antworten:
Sie können die
.update()
Methode verwenden, wenn Sie das Originald2
nicht mehr benötigen :Z.B:
Aktualisieren:
Natürlich können Sie das Wörterbuch zuerst kopieren, um ein neues zusammengeführtes zu erstellen. Dies kann erforderlich sein oder auch nicht. Falls Ihr Wörterbuch zusammengesetzte Objekte (Objekte, die andere Objekte wie Listen oder Klasseninstanzen enthalten) enthält,
copy.deepcopy
sollte dies ebenfalls berücksichtigt werden.quelle
isinstance(int, object) is True
nochdeepcopy
nicht notwendig erscheint.In Python2
d1 überschreibt d2:
d2 überschreibt d1:
Dieses Verhalten ist nicht nur ein Zufall bei der Implementierung. es ist in der Dokumentation garantiert :
quelle
**
Notation alle Schlüssel dieses Diktats Zeichenfolgen sein. Weitere Informationen finden Sie im Python-Dev-Thread ab mail.python.org/pipermail/python-dev/2010-April/099427.html .d = dict(**d1, **d2)
funktioniert, aber darauf verweist @IoannisFilippidis in ihrem Kommentar. Vielleicht wäre es klarer gewesen, das Snippet hier aufzunehmen, also hier ist es.Wenn Sie
d1
in den Konflikten Vorrang haben möchten , gehen Sie wie folgt vor:Ansonsten umgekehrt
d2
undd1
.quelle
Meine Lösung besteht darin, eine Zusammenführungsfunktion zu definieren . Es ist nicht raffiniert und kostet nur eine Zeile. Hier ist der Code in Python 3.
Tests
Es funktioniert für eine beliebige Anzahl von Wörterbuchargumenten. Gab es doppelte Schlüssel in diesem Wörterbuch, gewinnt der Schlüssel aus dem Wörterbuch ganz rechts in der Argumentliste.
quelle
.update
Aufruf (merged={}
gefolgt vonfor d in dict: merged.update(d)
) wäre kürzer, lesbarer und effizienter.reduce
undlambda
s verwenden möchten , wie wäre esreturn reduce(lambda x, y: x.update(y) or x, dicts, {})
?Trey Hunner hat einen schönen Blog-Beitrag , in dem verschiedene Optionen zum Zusammenführen mehrerer Wörterbücher beschrieben sind, darunter (für Python3.3 +) ChainMap und das Entpacken von Wörterbüchern .
quelle
Beginnend erstellt
Python 3.9
der Bediener|
ein neues Wörterbuch mit den zusammengeführten Schlüsseln und Werten aus zwei Wörterbüchern:Dies:
Beachten Sie auch den
|=
Operator, der d2 durch Zusammenführen von d1 mit Priorität für d1-Werte ändert:quelle
Ich glaube, dass, wie oben erwähnt, die Verwendung
d2.update(d1)
der beste Ansatz ist und dass Sie auchd2
zuerst kopieren können, wenn Sie es noch benötigen.Obwohl ich darauf hinweisen möchte, dass dies
dict(d1, **d2)
im Allgemeinen eine schlechte Methode zum Zusammenführen von Wörterbüchern ist, da Schlüsselwortargumente Zeichenfolgen sein müssen, schlägt dies fehl, wenn Sie Folgendes habendict
:quelle