si/si no en una lista de comprensión

Resuelto AP257 asked hace 13 años • 14 respuestas

¿Cómo convierto el siguiente forbucle que contiene if/ elseen una lista por comprensión?

results = []
for x in xs:
    results.append(f(x) if x is not None else '')

Debería ceder ''si xes Noney 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.

AP257 avatar Nov 24 '10 02:11 AP257
Aceptado

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 ifcondiciones ú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 ifdespués for…ines 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')
poke avatar Nov 23 '2010 19:11 poke

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/elseLas 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 ifdos 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 ifdeclaració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 conditionse evalúa. Si conditiones True, entonces <Exp1>se evalúa y se devuelve. Si conditiones 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 sestá condicionado al agevalor.

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 xsdeberí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?

Guzman Ojero avatar Aug 29 '2021 02:08 Guzman Ojero