2012-08-30 22 views
5

(Scusate, non ha potuto resistere il gioco di parole!)Python dict incomprensione

Mi chiedo perché non sembra possibile tradurre:

dict([(str(x),x) if x % 2 else (str(x),x*10) for x in range(10)]) 

in questa espressione più leggibile, utilizzando dict comprensione:

{str(x):x if x % 2 else str(x):x*10 for x in range(10)} 
+0

Come nota a margine, il primo può essere scritta come: 'dict ((str (x), X se i% 2 altro x * 10) per x nell'intervallo (10)) 'per simmetria con la soluzione di thg435. (Ho anche cambiato il list-comp in un generatore, perché ... perché no?) – mgilson

risposta

8
{ str(x):(x if x % 2 else x*10) for x in range(10) } 

sembra funzionare bene

+6

il mio consiglio '{str (x) :(x se x% 2 else x * 10) per x nell'intervallo (10)}' - uno più leggibile –

+0

@AlexeyKachayev: [Questo sito è modificato in modo collaborativo] (http://stackoverflow.com/faq), non lo sapevi? Se hai un suggerimento utile, modifica il post! – georg

+0

Si prega di notare che la comprensione del ditt è disponibile solo nella v2.7 + –

1

La precedenza è impostata in modo che if .. else non si applichi all'intera coppia key:value: è solo una parte del valore. Ciò significa che si vuole:

{str(x): (x if x % 2 else x*10 for x in range(10))} 

Nel caso improbabile che si voleva un calcolo diverso chiave, così come un valore diverso, in alcuni casi, si dovrebbe fare in questo modo:

{(str(x) if x % 2 else repr(x)) : x if x % 2 else x * 10 } 

che sarebbe equivalente a:

dict([(str(x),x) if x % 2 else (repr(x),x*10) for x in range(10)]) 

Oppure decidere che un ciclo esplicito è più leggibile di un one-liner per qualcosa di così complesso.

1

sembra che sia solo una questione o raggruppamento espressioni correttamente:

# original 
{str(x): (x if x % 2 else x*10) for x in range(10)} 

# slightly more complex, allowing both key and value to have the ternary 
{(str(x) if x % 3 else str(x+1)) : (x if x % 2 else x*10) for x in range(10)}