2013-12-10 44 views
8

ho trovato il seguente messaggio di overflow dello stack su comprensioni dict in Python2.7 e Python 3+: Create a dictionary with list comprehension in Python affermando che posso applicare comprensioni del dizionario come questo:comprensione dizionario in Python 3

d = {key: value for (key, value) in sequence} 

ho provato in Python 3. Tuttavia, solleva un'eccezione.

d = {'a':1, 'b':2, 'c':3, 'd':4} 
{key : value for (key, value) in d} 
{key : value for key, value in d} 

Entrambe le versioni sollevano una ValueError dicendo che ValueError: need more than 1 value to unpack.

Qual è il modo più semplice/diretto per rendere comprensibile un dizionario in Python3?

+2

Questa comprensione del dict prevede una sequenza di coppie chiave-valore. Lo stai dando ad un dict, che non è una sequenza di coppie chiave-valore. – user2357112

risposta

13

Il ciclo su un dizionario produce solo le chiavi . Utilizzare d.items() al ciclo su entrambi i tasti e valori:

{key: value for key, value in d.items()} 

Il ValueError eccezione che si vede è non un dict problema di comprensione, né è limitato a Python 3; si vedrebbe lo stesso problema in Python 2 o con un normale ciclo for:

>>> d = {'a':1, 'b':2, 'c':3, 'd':4} 
>>> for key, value in d: 
...  print key, value 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: need more than 1 value to unpack 

perché ogni iterazione c'è solo una voce di essere ceduto.

Senza una trasformazione, {k: v for k, v in d.items()} è solo un prolisso e costoso d.copy(); usa una comprensione di dict solo quando fai un po 'di più con le chiavi o i valori, o usi condizioni o un costrutto di loop più complesso.

1

Ben detto sopra - si può cadere oggetti in python3 se lo si fa in questo modo:

{key: d [key] per la chiave in d}

d = {'a':1, 'b':2, 'c':3, 'd':4} 
z = {x: d[x] for x in d} 
z 
>>>{'a': 1, 'b': 2, 'c': 3, 'd': 4} 

e questo prevede la possibilità di utilizzare anche le condizioni

y = {x: d[x] for x in d if d[x] > 1} 
y 
>>>{'b': 2, 'c': 3, 'd': 4} 

Divertiti!