2012-04-03 25 views
61

¿Podemos usar elif en la lista de comprensión?`elif` en la lista comprensión condicionales

Ejemplo:

l = [1, 2, 3, 4, 5] 

for values in l: 
    if values==1: 
     print 'yes' 
    elif values==2: 
     print 'no' 
    else: 
     print 'idle' 

¿Podemos incluir el elif en nuestra lista por comprensión, de una manera similar al código de arriba?

Por ejemplo, una respuesta como:

['yes', 'no', 'idle', 'idle', 'idle'] 

Hasta ahora, sólo han utilizado if y else en la lista de la comprensión.

Respuesta

132

de Python conditional expressions fueron diseñados precisamente para este tipo de casos de uso:

>>> l = [1, 2, 3, 4, 5] 
>>> ['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 

Esperanza esto ayuda :-)

+8

me gusta cómo éstos encadenar – jamylak

+1

hay algo de inte ng historial en la sintaxis. Durante muchos años antes de su introducción, las "expresiones terciarias" fueron uno de los cinco cambios más solicitados en el idioma. Como Guido van Rossum lo diseñó explícitamente como un lenguaje basado en declaraciones, resistió firmemente durante mucho tiempo (las expresiones terciarias, y particularmente su abuso, son fuentes de mucha oscuridad en el código). Cuando finalmente sucumbió, anunció que había elegido deliberadamente una sintaxis que desalentaba el uso excesivo. Como de costumbre, hizo un trabajo de diseño elegante sin embargo. – holdenweb

+1

Ternario, maldición (escribió, notando su error disléxico demasiado tarde para editar). – holdenweb

41
>>> d = {1: 'yes', 2: 'no'} 
>>> [d.get(x, 'idle') for x in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 
+4

Creo que esta forma es mucho más fácil de digerir que tratar de hacer una lógica si/else realmente larga y complicada dentro de la lista comp – jdi

+5

@ jdi Aunque las expresiones condicionales pueden no ser de tu agrado, * fueron * específicamente diseñadas para manejar las cadenas if-elif-elif-else, tal como lo solicitó el OP. No son difíciles de aprender y pueden manejar con gracia situaciones que no son tan adecuadas para la lógica de búsqueda del diccionario: '' 'A' if grade> = 90 else 'B' si grade> = 80 else 'C' if grade> = 70 else 'F'''. –

+0

¿Hay una ventaja de definir 'd' fuera de la comprensión? –

1

Puede utilizar la lista de comprensión es que se va a crear otra lista del original.

>>> l = [1, 2, 3, 4, 5] 
>>> result_map = {1: 'yes', 2: 'no'} 
>>> [result_map[x] if x in result_map else 'idle' for x in l] 
['yes', 'no', 'idle', 'idle', 'idle'] 
13

Puede, más o menos.

Tenga en cuenta que cuando se utiliza como sytax:

['yes' if v == 1 else 'no' for v in l] 

Está utilizando la forma ternaria del operador if/else (si está familiarizado con lenguajes como C, esto es como el constructo ?:: (v == 1 ? 'yes' : 'no'))

La forma ternaria de la if/else operador no tiene un 'elif' incorporada, pero se puede simular en el 'otro' condición:

['yes' if v == 1 else 'no' if v == 2 else 'idle' for v in l] 

Esto es como decir:

for v in l: 
    if v == 1 : 
     print 'yes' 
    else: 
     if v == 2: 
      print 'no' 
     else: 
      print 'idle' 

Así que no existe una construcción directa 'elif' como la que ha preguntado, pero se puede simular con sentencias if/else anidadas.

1

Otra forma sencilla es utilizar la lista de comprensión condicional como esto:

l=[1,2,3,4,5] 
print [[["no","yes"][v==1],"idle"][v!=1 and v!=2] for v in l] 

le da la anwer correcta:

[ 'sí', 'no', 'inactivo', 'inactivo', 'inactivo']

0

Tal vez usted quiere esto:

l = [1, 2, 3, 4, 5] 

print ([['idle','no','yes'][2*(n==1)+(n==2)] for n in l])