2012-11-13 10 views
9

Ich versuche, zwei Wörterbücher zusammenzufassen wie folgt aus:Typeerror: nicht unterstützte Operandtyp (e) für +: 'dict_items' und 'dict_items'

my_new_dict = dict(my_existing_dict.items() + my_new_dict.items()) 

aber recieve Fehler

TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items' 

Was ich tun falsch?

+0

Nebenbei bemerkt: Wenn Sie mehr als zwei Wörterbücher iterieren wollen, und Sie wissen, dass sie eindeutige Schlüssel (oder ist es egal, wenn Du verarbeitest den gleichen Schlüssel zweimal), überlege dir, itertools.chain zu benutzen (dict_a, dict_b) – Moberg

Antwort

20

In python3, dict.items() gibt ein Objekt mit Typ dict_items die offenbar nicht hinzugefügt werden kann. (In Python 2 gab es eine list zurück, die hinzugefügt werden konnte).

Eine alternative Möglichkeit, ein Paar von Wörterbuch, die auf py2k und py3k arbeiten hinzuzufügen:

d = dict1.copy() 
d.update(dict2) 

Natürlich gibt es einige Unklarheiten über das, was Sie im Fall von Schlüsseln Kollisionen passieren sollen. z.B. wenn beide dicts haben key1, wessen key1 sollte in der Ausgabe erhalten bleiben? Oder sollten Sie eine Kombination ihrer beiden Werte verwenden? Im letzteren Fall, werden Sie wahrscheinlich etwas aus dem collections Modul wollen (entweder defaultdict oder Counter)

+0

danke, es funktioniert! Ich hasse 2.7> 3.2 Migration ... – JohnDow

+1

@ VladislavIl'ushin: Sie ** wirklich ** sollte Dokumente lesen. – SilentGhost

+0

@mgilson: Ich denke, dass 'dict.items()' in 3+ entspricht 'dict.iteritems() 'in 2.6, das heißt, es ist ein Iterator. –

17

Das erste Problem ist, das ist mehrdeutig - Wörterbücher können keine doppelten Schlüssel haben, so ist es unklar, was Sie meinen, was passieren soll, wenn beide den gleichen Schlüssel enthalten?

Das Hauptproblem hier ist jedoch, dass dictionary views are set-like, so dass sie nicht zusätzlich implementiert haben.

Was Sie wahrscheinlich wollen, ist die union: d1.items() | d2.items(), die Ihnen eine Reihe von Tupel von (key, value) geben wird. Wenn Sie es dann an dict() übergeben und es Dubletten gibt, wird der letzte Wert verwendet.

Also, kurz gesagt:

dict(d1.items() | d2.items()) 
+5

Wenn ich das versuche, bekomme ich: 'TypeError: nicht hashbarer Typ: 'dict'' –

+0

Lebensretter! Netter Trick, mein Freund! –

Verwandte Themen