Supongamos que tengo una lista L que consta de elementos enteros. Quiero construir una lista T que para cada índice i en 0..len (L) contenga el elemento L [i] siempre que sea mayor que 0 usando la comprensión de lista en python.

Intenté el siguiente comando para hacer esto

T=[L[i] if L[i]>0 for i in range(len(L))] 

Pero sigo recibiendo un error de sintaxis no válida. ¿Cómo haría esto correctamente usando Lista de comprensiones en Python?

2
Iltl 29 oct. 2017 a las 17:20

3 respuestas

La mejor respuesta

Su sintaxis es incorrecta :

L = [1,2,-4,5,-6,7,8,9]
T = [L[i] for i in range(len(L)) if L[i]>0] 

Salida:

[1, 2, 5, 7, 8, 9]

También puede iterar a través de los elementos de la lista per se, sin necesidad de utilizar un range. De esta manera: T = [i for i in L if i>0]

Recuerda:

Cuando solo hay if, la sintaxis es [expression for var in list if ...]

Cuando tanto if como else están ahí, la sintaxis es [expression1 if ... else expression2 for var in list]

6
Miraj50 29 oct. 2017 a las 15:54

Debe escribir el filtro después de la parte de iteración . Entonces:

   T=[L[i] for i in range(len(L)) if L[i]>0]
#     \__/ \_______ ____________/ \___ ___/
#     yield        v                  v
#               iteration           filter

En este momento, Python cree que desea escribir un operador ternario , como:

T=[L[i] if L[i] > 0 else 0 for i in range(len(L))]

Esto es incorrecto: aquí evaluaría L[i] if L[i] > 0 else 0 para cada elemento y, por lo tanto, agregaría un 0 para cada elemento L[i] donde el elemento es menor o igual a cero

Dicho esto, puede escribir su lista de comprensión más elegante (y más rápido), con:

T = [l for l in L if l > 0]

Entonces, en lugar de iterar sobre índices, iteramos sobre los elementos l en L. También filtramos en l y producimos l en caso de que el filtrado sea exitoso.

4
Willem Van Onsem 29 oct. 2017 a las 14:33

Si bien puede usar una comprensión de lista para resolver este problema, también puede usar filter con una función lambda:

final_l = list(filter(lambda x:x > 0, L))
2
Ajax1234 29 oct. 2017 a las 14:27