TypeError: unsupported operand type(s) for +: 'dict_items' und 'dict_items'
Ich versuche Summe zwei Wörterbücher wie:
my_new_dict = dict(my_existing_dict.items() + my_new_dict.items())
aber erhalten Fehler
TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
Was ich falsch mache?
Nebenbei bemerkt: Wenn Sie möchten, Durchlaufen Sie zwei Wörterbüchern, und Sie wissen, Sie haben einen einmaligen Schlüssel (oder ist es egal, wenn Sie die gleiche Taste zweimal), betrachten Sie mit itertools.Kette(dict_a, dict_b)
InformationsquelleAutor JohnDow | 2012-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Python ist3,
dict.items()
gibt ein Objekt vom Typdict_items
die anscheinend nicht Hinzugefügt werden können. (in python 2, kehrte er einlist
die Hinzugefügt werden könnten).Alternative Möglichkeit zum hinzufügen von ein paar Wörterbücher, die sich auf py2k und py3k:
Natürlich, es gibt etwas Zweideutigkeit über das, was Sie wollen geschehen im Fall von Schlüssel-Kollisionen. wenn z.B. beide dicts haben
key1
, derenkey1
bewahrt werden sollte, in der Ausgabe? Oder sollten Sie verwenden eine Kombination der beiden Werte? Im letzteren Fall, werden Sie wahrscheinlich wollen etwas von dercollections
- Modul (entwederdefaultdict
oderCounter
)Sie wirklich sollten die docs Lesen.
Ich denke, dass
dict.items()
im 3+ ist äquivalent zudict.iteritems()
in 2.6, das heißt, es ist ein iterator.gut, ich stehe korrigiert (und mehr gelernt...)
Es ist gut, jeden Tag etwas neues lernen :).
InformationsquelleAutor mgilson
Seit PEP 448 (Python 3.5), es ist eine sehr einfache und lesbare Lösung, die ich empfehlen würde:
Können Sie jetzt unpackings in Literale und mehrere unpackings, was bedeutet, dass das funktioniert.
Ein problem ist das Verhalten, das Sie wollen, ist mehrdeutig - Wörterbücher nicht haben, können doppelte Schlüssel, so ist es unklar, was geschehen soll, wenn beide enthalten den gleichen Schlüssel. Die Skillung ist explizit über das, was passieren soll, wenn mit dieser Methode:
Wenn Sie möchten, dass das umgekehrte Verhalten, können Sie einfach tauschen Sie die Reihenfolge der Wörterbücher in der wörtlichen. Wenn Sie möchten, eine Ausnahme auslösen, können Sie die
dict()
Methode, die nicht akzeptieren, die doppelte Argumente, ich.e:In älteren Versionen von Python 3, dein Ansatz ist gültig, aber das Problem hier ist, dass dictionary-Ansichten einstellen-wie, so dass Sie nicht zusätzlich implementiert.
Was Sie wahrscheinlich wollen, ist die union:
d1.items() | d2.items()
, die Ihnen eine Menge von Tupeln der(key, value)
. Wenn Sie dann übergeben es andict()
und es gibt Duplikate, die "Letzte" Wert wird verwendet, jedoch setzt (im Gegensatz zu den Ansichten selbst) sind ungeordnet, so gibt es keine Garantie, die Artikel werden am Ende die "erste" in der kombinierten Gruppe, was bedeutet, dass die man "gewinnt" ist willkürlich.So, in short, solange die Reihenfolge nicht wichtig ist:
Beachten Sie, dass in Python 2,
dict.items()
gibt einfach einelist
, wo Ihr Ansatz funktionieren wird.TypeError: unhashable type: 'dict'
Lebensretter! netter trick, mein Freund!
Mit Python 3.6.1, bemerkte ich, wenn ein Element in beiden
d1
undd2
scheint esdict(d1.items() | d2.items())
Ergebnisse in d1's Elemente wirksam im Fall von Dubletten, das ist nicht das, was ich erwartet hatte.dict(list(d1.items()) + list(d2.items()))
sich so verhält, wie ich erwarte, mitd2
gewinnen im Falle von Duplikaten.Ja, die Sätze sind ungeordnet, während die Wörterbücher sind (jetzt) bestellt. Meine Formulierung war missverständlich, da "last" bedeutet nicht viel, wenn die sets sind bestellt willkürlich. Wenn Sie möchten, zu erhalten, um Sie tatsächlich zu benutzen brauchen eine geordnete Sammlung wie in einer Liste (gegen eine kleine zusätzliche Kosten für den Bau).
Siehe meine Letzte edit für eine aktualisierte Ansatz, den ich denke, ist die beste option in allen Fällen.
InformationsquelleAutor Gareth Latty
Einen anderen Ansatz für die anderen vorgeschlagenen Antworten ist:
dict(list(d1.items()) + list(d2.items()))
Wenn es Tasten in beiden
d1
undd2
, wird der Wert ind2
wird in der final-Wörterbuch.InformationsquelleAutor erwaman