Python Language Lista de comprensiones condicionales


Ejemplo

Dada una lista de comprensión , puede agregar uno o más if condiciones para filtrar los valores.

[<expression> for <element> in <iterable> if <condition>]

Para cada <element> en <iterable> ; Si <condition> evalúa como True , agregue <expression> (generalmente una función de <element> ) a la lista devuelta.


Por ejemplo, esto se puede usar para extraer solo números pares de una secuencia de enteros:

[x for x in range(10) if x % 2 == 0]
# Out: [0, 2, 4, 6, 8]

Demo en vivo

El código anterior es equivalente a:

even_numbers = [] 
for x in range(10):
    if x % 2 == 0:
        even_numbers.append(x)

print(even_numbers)
# Out: [0, 2, 4, 6, 8]

Además, una comprensión condicional de la lista de la forma [e for x in y if c] (donde e y c son expresiones en términos de x ) es equivalente a list(filter(lambda x: c, map(lambda x: e, y))) .

A pesar de proporcionar el mismo resultado, preste atención al hecho de que el ejemplo anterior es casi 2 veces más rápido que el segundo. Para aquellos que tienen curiosidad, esta es una buena explicación de la razón.


Tenga en cuenta que esto es bastante diferente de la expresión condicional ... if ... else ... (a veces conocida como expresión ternaria ) que puede usar para la parte <expression> de la lista de comprensión. Considere el siguiente ejemplo:

[x if x % 2 == 0 else None for x in range(10)]
# Out: [0, None, 2, None, 4, None, 6, None, 8, None]

Demo en vivo

Aquí, la expresión condicional no es un filtro, sino un operador que determina el valor que se utilizará para los elementos de la lista:

<value-if-condition-is-true> if <condition> else <value-if-condition-is-false>

Esto se vuelve más obvio si lo combinas con otros operadores:

[2 * (x if x % 2 == 0 else -1) + 1 for x in range(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Demo en vivo

Si está utilizando Python 2.7, xrange puede ser mejor que el range por varios motivos, como se describe en la documentación de xrange .

[2 * (x if x % 2 == 0 else -1) + 1 for x in xrange(10)]
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

El código anterior es equivalente a:

numbers = []
for x in range(10):
    if x % 2 == 0:
        temp = x
    else:
        temp = -1
    numbers.append(2 * temp + 1)
print(numbers)
# Out: [1, -1, 5, -1, 9, -1, 13, -1, 17, -1]

Se puede combinar expresiones ternarios y if las condiciones. El operador ternario trabaja en el resultado filtrado:

[x if x > 2 else '*' for x in range(10) if x % 2 == 0]
# Out: ['*', '*', 4, 6, 8]

Lo mismo no podría haberse logrado solo por el operador ternario:

[x if (x > 2 and x % 2 == 0) else '*' for x in range(10)]
# Out:['*', '*', '*', '*', 4, '*', 6, '*', 8, '*']

Vea también: Filtros , que a menudo proporcionan una alternativa suficiente a las comprensiones de listas condicionales.