python - pyplot - si más en una lista de comprensión
python pyplot title (8)
Esta pregunta ya tiene una respuesta aquí:
- Si / else en la lista de comprensión de Python? 5 respuestas
Tengo una lista l
:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
Para los números por encima de 45 inclusive, me gustaría agregar 1; y para los números menos que 5.
Lo intenté
[x+1 for x in l if x >= 45 else x+5]
Pero me da un error de sintaxis. ¿Cómo puedo lograr un " if
" de else
como este en una lista de comprensión?
Acabo de tener un problema similar, y encontré esta pregunta y las respuestas realmente útiles. Aquí está la parte sobre la que estaba confundido. Lo estoy escribiendo explícitamente porque nadie lo dijo simplemente en inglés:
La iteración va al final.
Normalmente, un bucle va
for this many times:
if conditional:
do this thing
else:
do something else
Todos declaran la parte de la lista de comprensión simplemente como lo hizo la primera respuesta,
[ expression for item in list if conditional ]
Pero eso no es realmente lo que haces en este caso. (Estaba tratando de hacerlo de esa manera)
En este caso, es más como esto:
[ expression if conditional else other thing for this many times ]
Al igual que en [a if condition1 else b for i in list1 if condition2]
, los dos if
s con condition1
y condition2
haciendo dos cosas diferentes. La parte (a if condition1 else b)
es de una expresión lambda:
lambda x: a if condition1 else b
mientras que la otra condition2
es otra lambda:
lambda x: condition2
La comprensión de la lista completa se puede considerar como una combinación de map
y filter
:
map(lambda x: a if condition1 else b, filter(lambda x: condition2, list1))
Debe poner la expresión al comienzo de la lista de comprensión, ¡una declaración if al final filtra los elementos!
[x+1 if x >= 45 else x+5 for x in l]
La razón por la que recibe este error tiene que ver con cómo se realiza la comprensión de la lista.
Tenga en cuenta lo siguiente:
[ expression for item in list if conditional ]
Es equivalente a:
for item in list:
if conditional:
expression
Donde la expression
está en un formato ligeramente diferente (piense en cambiar el orden del sujeto y el verbo en una oración).
Por lo tanto, su código [x+1 for x in l if x >= 45]
hace esto:
for x in l:
if x >= 45:
x+1
Sin embargo, este código [x+1 if x >= 45 else x+5 for x in l]
hace esto (después de reorganizar la expression
):
for x in l:
if x>=45: x+1
else: x+5
Podrías mover el condicional a:
v = [22, 13, 45, 50, 98, 69, 43, 44, 1]
[ (x+1 if x >=45 else x+5) for x in v ]
Pero está empezando a verse un poco feo, por lo que es mejor que uses un ciclo normal. Tenga en cuenta que utilicé v
lugar de l
para la variable de lista para reducir la confusión con el número 1 (creo que I y O
deben evitarse como nombres de variables en cualquier circunstancia, incluso en el código de ejemplo rápido y sucio).
También puede poner la expresión condicional entre paréntesis dentro de la lista de comprensión:
l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
print [[x+5,x+1][x >= 45] for x in l]
[false, true] [condición] es la sintaxis
>>> l = [22, 13, 45, 50, 98, 69, 43, 44, 1]
>>> [x+1 if x >= 45 else x+5 for x in l]
[27, 18, 46, 51, 99, 70, 48, 49, 6]
Hacer algo si <condition>
, sino hacer algo más.
[x+1 if x >= 45 else x+5 for x in l]
Y como recompensa, aquí está el comentario, escribí para recordar esto la primera vez que cometí este error:
La expresión condicional de Python es
a if C else b
y no puede usarse como:
[a for i in items if C else b]
La forma correcta es:
[a if C else b for i in items]
Aunque existe una forma válida:
[a for i in items if C]
Pero eso no es lo mismo que la forma en que se filtra por
C
, pero se pueden combinar:
[a if tC else b for i in items if fC]