si/si no en una lista de comprensión
¿Cómo convierto el siguiente for
bucle que contiene if
/ else
en una lista por comprensión?
results = []
for x in xs:
results.append(f(x) if x is not None else '')
Debería ceder ''
si x
es None
y en caso contrario f(x)
. Lo intenté:
[f(x) for x in xs if x is not None else '']
pero da un SyntaxError
. ¿Cual es la sintaxis correcta?
Consulte ¿Python tiene un operador condicional ternario? para obtener información sobre ... if ... else ...
.
Consulte Comprensión de listas con condición para omitir valores según una condición: [... for x in xs if x cond]
.
Consulte `elif` en la lista de condicionales de comprensión para elif
.
Puedes hacer eso totalmente. Es sólo una cuestión de orden:
[f(x) if x is not None else '' for x in xs]
En general,
[f(x) if condition else g(x) for x in sequence]
Y, para listas por comprensión con if
condiciones únicamente,
[f(x) for x in sequence if condition]
Tenga en cuenta que esto en realidad usa una construcción de lenguaje diferente, una expresión condicional , que en sí misma no es parte de la sintaxis de comprensión , mientras que el if
después for…in
es parte de la lista de comprensión y se usa para filtrar elementos del iterable fuente.
Las expresiones condicionales se pueden utilizar en todo tipo de situaciones en las que desee elegir entre dos valores de expresión en función de alguna condición. Esto hace lo mismo que el operador ternario ?:
que existe en otros idiomas . Por ejemplo:
value = 123
print(value, 'is', 'even' if value % 2 == 0 else 'odd')
Usemos esta pregunta para revisar algunos conceptos. Creo que es bueno ver primero los fundamentos para poder extrapolarlos a diferentes casos.
Otras respuestas proporcionan la respuesta específica a su pregunta. Primero daré un contexto general y luego responderé la pregunta.
Fundamentos
if/else
Las declaraciones en listas por comprensión implican dos cosas:
- Lista por comprensión
- Expresiones condicionales (operadores ternarios)
1. Listar por comprensión
Proporcionan una forma concisa de crear listas.
Su estructura consta de: " paréntesis que contienen una expresión seguida de una cláusula for, luego cero o más cláusulas for o if ".
Caso 1
Aquí no tenemos ninguna condición. Cada elemento del iterable se agrega a new_list
.
new_list = [expression for item in iterable]
new_list = [x for x in range(1, 10)]
> [1, 2, 3, 4, 5, 6, 7, 8, 9]
Caso 2
Aquí tenemos una condición.
Ejemplo 1
Condición: solo se agregarán números pares a new_list
.
new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0]
> [2, 4, 6, 8]
Ejemplo 2
Condición: solo se sumarán los números paresnew_list
que sean múltiplos de 3 .
new_list = [expression for item in iterable if condition == True]
new_list = [x for x in range(1, 10) if x % 2 == 0 if x % 3 == 0]
> [6]
Pero ¿cómo es que tenemos una condición si usamos if
dos new_list
?
La expresión anterior podría escribirse como:
new_list = [x for x in range(1, 10) if x % 2 and x % 3 == 0]
> [6]
Sólo utilizamos una if
declaración.
Esto es como hacer:
new_list = []
for x in range(1, 10):
if x % 2 == 0 and x % 3 == 0:
new_list.append(x)
> [6]
Ejemplo 3
Sólo por el bien del argumento, también puedes usar or
.
Condición: se sumarán números pares o múltiplos de 3new_list
.
new_list = [x for x in range(1, 10) if x % 2 == 0 or x % 3 == 0]
> [2, 3, 4, 6, 8, 9]
Caso 3
Más de una condición:
Aquí necesitamos la ayuda de expresiones condicionales (operadores ternarios).
2.Expresiones condicionales
¿Qué son las expresiones condicionales? Lo que dice el nombre: una expresión de Python que tiene alguna condición.
<Exp1> if condition else <Exp2>
Primero condition
se evalúa. Si condition
es True
, entonces <Exp1>
se evalúa y se devuelve. Si condition
es False
, entonces <Exp2>
se evalúa y se devuelve.
Una expresión condicional con más de una condición:
<Exp1> if condition else <Exp2> if condition else <Exp3>...
Un ejemplo de Real Python :
age = 12
s = 'minor' if age < 21 else 'adult'
> minor
El valor de s
está condicionado al age
valor.
3.Enumerar comprensiones con condicionales
Juntamos listas por comprensión y condicionales de esta manera.
new_list = [<Conditional Expression> for <item> in <iterable>]
new_list = [<Exp1> if condition else <Exp2> if condition else <Exp3> for <item> in <iterable>]
Condición: los números pares se sumarán como 'even'
, el número tres se sumará como 'number three'
y el resto se sumarán como 'odd'
.
new_list = ['even' if x % 2 == 0 else 'number three' if x == 3 else 'odd'
for x in range(1, 10)]
> ['odd', 'even', 'number three', 'even', 'odd', 'even', 'odd', 'even', 'odd']
La respuesta a la pregunta
[f(x) for x in xs if x is not None else '']
Aquí tenemos un problema con la estructura de la lista: for x in xs
debería estar al final de la expresión.
Manera correcta:
[f(x) if x is not None else '' for x in xs]
Otras lecturas:
¿Python tiene un operador condicional ternario?