2012-11-13 11 views
9

provo a riassumere due dizionari di simile:TypeError: tipo non supportato operando (s) per +: 'dict_items' e 'dict_items'

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

ma recieve errore

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

Quello che faccio sbagliato?

+0

Nota a margine: Se si desidera iterare due dizionari, e sanno di avere chiavi univoche (o non importa se si elabora la stessa chiave due volte), si consideri l'uso di itertools.chain (dict_a, dict_b) – Moberg

risposta

20

In python3, dict.items() restituisce un oggetto di tipo dict_items, che a quanto pare non può essere aggiunto. (in Python 2, è stato restituito uno list che potrebbe essere aggiunto).

Un modo alternativo per aggiungere un paio di dizionari che funziona su py2k e py3k:

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

Naturalmente, c'è una certa ambiguità su ciò che si desidera che accada nel caso di collisioni chiave. per esempio. se entrambi i dicts hanno key1, di cui key1 deve essere conservato nell'output? O dovresti usare una combinazione di entrambi i loro valori? In quest'ultimo caso, probabilmente si vorrà qualcosa dal modulo collections (sia defaultdict o Counter)

+0

grazie, funziona! Odio la migrazione 2.7> 3.2 ... – JohnDow

+1

@ VladislavIl'ushin: tu ** veramente ** dovrebbe leggere i documenti. – SilentGhost

+0

@mgilson: Penso che 'dict.items()' in 3+ sia equivalente a 'dict.iteritems()' in 2.6, cioè, è un iteratore. –

17

Il primo problema è che è ambiguo - i dizionari non possono avere chiavi duplicate, quindi non è chiaro cosa intendi, cosa dovrebbe accadere se entrambi contengono la stessa chiave?

Il problema principale qui, tuttavia, è che dictionary views are set-like, quindi non sono state implementate aggiunte.

Quello che probabilmente si desidera è lo union: d1.items() | d2.items(), che fornisce una serie di tuple di (key, value). Se poi lo passi a dict() e ci sono duplicati, l'ultimo valore sarà quello usato.

Così, in breve:

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

Quando provo questo ottengo: 'TypeError: tipo non disattivabile: 'dict'' –

+0

lifesaver! bel trucco, amico mio! –

Problemi correlati