7080 Stimmen

Wie führe ich zwei Wörterbücher in einem einzigen Ausdruck zusammen (Vereinigung von Wörterbüchern)?

Ich möchte zwei Wörterbücher zu einem neuen Wörterbuch zusammenführen.

x = {'a': 1, 'b': 2}
y = {'b': 10, 'c': 11}

z = merge(x, y)

>>> z
{'a': 1, 'b': 10, 'c': 11}

使用方法 x.update(y) modifiziert x anstelle eines neuen Wörterbuchs zu erstellen. Ich möchte auch, dass die Konfliktbehandlung des letzten Gewinners von dict.update() auch.

101voto

Greg Hewgill Punkte 882617
x = {'a':1, 'b': 2}
y = {'b':10, 'c': 11}
z = dict(x.items() + y.items())
print z

Bei Einträgen mit Schlüsseln in beiden Wörterbüchern ("b") können Sie steuern, welcher Schlüssel in der Ausgabe landet, indem Sie ihn als letztes einfügen.

32 Stimmen

In Python 3 würden Sie TypeError: unsupported operand type(s) für +: 'dict_items' und 'dict_items' erhalten ... Sie sollten jedes dict mit list() kapseln wie: dict(list(x.items()) + list(y.items()))

3 Stimmen

@justSaid itertools.chain(x.items(), y.items()) könnte ebenfalls verwendet werden.

97voto

driax Punkte 2378

Die beste Version, die ich mir vorstellen kann, ohne eine Kopie zu verwenden, wäre die folgende:

from itertools import chain
x = {'a':1, 'b': 2}
y = {'b':10, 'c': 11}
dict(chain(x.iteritems(), y.iteritems()))

Es ist schneller als dict(x.items() + y.items()) aber nicht so schnell wie n = copy(a); n.update(b) , zumindest bei CPython. Diese Version funktioniert auch in Python 3, wenn Sie die iteritems() a items() was automatisch vom 2to3-Tool erledigt wird.

Mir persönlich gefällt diese Version am besten, weil sie ziemlich gut beschreibt, was ich in einer einzigen funktionalen Syntax will. Das einzige kleine Problem ist, dass es nicht ganz klar ist, dass Werte aus y Vorrang vor Werten aus x haben, aber ich glaube nicht, dass es schwierig ist, das herauszufinden.

76voto

phobie Punkte 2376

Die Frage wurde zwar bereits mehrfach beantwortet, wurde diese einfache Lösung des Problems noch nicht aufgeführt.

x = {'a':1, 'b': 2}
y = {'b':10, 'c': 11}
z4 = {}
z4.update(x)
z4.update(y)

Es ist genauso schnell wie z0 und das oben erwähnte böse z2, aber einfach zu verstehen und zu ändern.

3 Stimmen

Aber es sind drei Aussagen statt eines Ausdrucks

18 Stimmen

Ja! Die genannten Ein-Ausdruck-Lösungen sind entweder langsam oder böse. Guter Code ist lesbar und wartbar. Das Problem ist also die Frage, nicht die Antwort. Wir sollten nach der besten Lösung für ein Problem fragen, nicht nach einer Ein-Zeilen-Lösung.

11 Stimmen

Verlieren Sie die z4 = {} und ändern Sie die nächste Zeile in z4 = x.copy() -- besser als nur guter Code tut keine unnötigen Dinge (was ihn noch lesbarer und wartbarer macht).

68voto

Sam Watkins Punkte 7162
def dict_merge(a, b):
  c = a.copy()
  c.update(b)
  return c

new = dict_merge(old, extras)

Unter solchen fragwürdigen und zweifelhaften Antworten ist dieses leuchtende Beispiel der einzig gute Weg, um Diktate in Python zusammenzuführen, und wird von dictator for life unterstützt Guido van Rossum selbst! Jemand anderes hat die Hälfte davon vorgeschlagen, aber nicht in eine Funktion eingefügt.

print dict_merge(
      {'color':'red', 'model':'Mini'},
      {'model':'Ferrari', 'owner':'Carl'})

gibt:

{'color': 'red', 'owner': 'Carl', 'model': 'Ferrari'}

63voto

Robino Punkte 3773

Sei pythonisch. Benutze eine Verständnis :

z={i:d[i] for d in [x,y] for i in d}

>>> print z
{'a': 1, 'c': 11, 'b': 10}

1 Stimmen

Als Funktion: def dictmerge(*args): return {i:d[i] for d in args for i in d}

3 Stimmen

Speichern Sie eine Suche, indem Sie die Schlüssel/Wertpaare direkt durchlaufen: z={k: v for d in (x, y) for k, v in d.items()}

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