In Python3 wird die items
Methode gibt nicht mehr eine Liste zurück sondern vielmehr eine siehe die sich wie eine Menge verhält. In diesem Fall müssen Sie die Mengenvereinigung nehmen, da die Verkettung mit +
wird nicht funktionieren:
dict(x.items() | y.items())
Für python3-ähnliches Verhalten in Version 2.7 wird die viewitems
Methode sollte anstelle von items
:
dict(x.viewitems() | y.viewitems())
Ich bevorzuge diese Schreibweise, da es natürlicher erscheint, sie als eine Operation zur Vereinigung von Mengen und nicht als eine Verkettung (wie der Titel zeigt) zu betrachten.
Editar:
Ein paar weitere Punkte für Python 3. Erstens: Beachten Sie, dass die dict(x, **y)
Trick wird in Python 3 nicht funktionieren, es sei denn, die Schlüssel in y
sind Zeichenfolgen.
Außerdem: Raymond Hettingers Chainmap Antwort ist ziemlich elegant, da es eine beliebige Anzahl von Dicts als Argumente annehmen kann, aber aus den Unterlagen sieht es so aus, als ob es eine Liste aller Dicts für jede Suche sequentiell durchsucht:
Lookups durchsuchen die zugrunde liegenden Mappings nacheinander, bis ein Schlüssel gefunden wird.
Dies kann zu einer Verlangsamung führen, wenn Sie viele Suchvorgänge in Ihrer Anwendung haben:
In [1]: from collections import ChainMap
In [2]: from string import ascii_uppercase as up, ascii_lowercase as lo; x = dict(zip(lo, up)); y = dict(zip(up, lo))
In [3]: chainmap_dict = ChainMap(y, x)
In [4]: union_dict = dict(x.items() | y.items())
In [5]: timeit for k in union_dict: union_dict[k]
100000 loops, best of 3: 2.15 µs per loop
In [6]: timeit for k in chainmap_dict: chainmap_dict[k]
10000 loops, best of 3: 27.1 µs per loop
Die Suchvorgänge sind also um etwa eine Größenordnung langsamer. Ich bin ein Fan von Chainmap, aber sieht weniger praktisch, wo es viele Lookups sein kann.