2012-08-30 11 views
5

(Lo siento, no pudo resistir el juego de palabras!)Python dict incomprensión

Me pregunto por qué no parece posible traducir:

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

en esta expresión más legible, usando la comprensión dict:

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

Como nota al margen, el primero se puede escribir como: 'dict ((str (x), x si i% 2 persona x * 10) para x en el rango (10)) 'para la simetría con la solución de thg435. (También cambié el list-comp a un generador, porque ... ¿por qué no?) – mgilson

Respuesta

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

parece funcionar bien

+6

mi consejo '{str (x) :(x si x% 2 else x * 10) para x en el rango (10)}' - uno más legible –

+0

@AlexeyKachayev: [Este sitio está editado colaborativamente] (http://stackoverflow.com/faq), ¿no lo sabías? Si tienes una sugerencia útil, ¡solo edita la publicación! – georg

+0

Tenga en cuenta que la comprensión dict solo está disponible en v2.7 + –

1

La precedencia se establece para que if .. else no se aplique a todo el key:value par: es solo una parte del valor. Esto significa que quiere:

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

En el hipotético caso de que quería un cálculo diferente clave, así como un valor diferente, en algunos casos, habría que hacerlo de esta manera:

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

lo que sería equivalente a:

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

O decidir que un bucle explícito es más legible que una sola línea para algo tan complejo.

1

parece que es sólo una cuestión o agrupar expresiones correctamente:

# 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)} 
Cuestiones relacionadas