Lista de comprensión con múltiples condiciones (python)

El siguiente código funciona en Python

var=range(20) var_even = [0 if x%2==0 else x for x in var] print var,var_even 

Sin embargo, pensé que las condiciones deben ponerse al final de una lista. Si hago el codigo

 var_even = [0 if x%2==0 for x in var] 

Entonces no funcionará. ¿Hay alguna razón para esto?

Aquí hay dos syntax distintas pero de aspecto similar, expresiones condicionales y cláusulas de filtro de comprensión de lista .

Una expresión condicional es de la forma x if y else z . Esta syntax no está relacionada con listas de comprensión. Si desea incluir condicionalmente una cosa o una cosa diferente en una lista de comprensión, esto es lo que usaría:

 var_even = [x if x%2==0 else 'odd' for x in var] # ^ "if" over here for "this or that" 

Una cláusula de filtro de comprensión de lista es el elemento if thing en elem for x in y if thing . Esto es parte de la syntax de comprensión de lista, y va después de la cláusula for . Si desea incluir o no incluir condicionalmente un elemento en una lista de comprensión, esto es lo que usaría:

 var_even = [x for x in var if x%2==0] # ^ "if" over here for "this or nothing" 

0 if x%2==0 la syntax es value1 if conditionX else value2 , lo que hace es si conditionX es verdadero, devuelve value1, de lo contrario devuelve value2. No puede usarlo si desea obtener los números de evento de la lista, siempre devuelve el valor 0 si es un número par y se pierde la cláusula else

Puedes lograrlo así:

 >>> var_even = [x for x in var if x % 2 ==0] >>> var_even [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

Alternativamente, puedes usar el filtro:

 >>> even_numbers = filter(lambda x: x % 2 == 0, var) >>> list(even_numbers) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]