pyplot python list list-comprehension if-statement

python - pyplot - si más en una lista de comprensión



python pyplot title (8)

Esta pregunta ya tiene una respuesta aquí:

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]