2012-01-01 16 views
10

Normalmente, las listas de comprensión se utilizan para derivar una nueva lista de una lista existente. Por ejemplo:uso apropiado de listas de comprensión - python

>>> a = [1, 2, 3, 4, 5] 
>>> [i for i in a if i > 2] 
[3, 4, 5] 

¿Deberíamos utilizarlos para realizar otros procedimientos? Por ejemplo:

>>> a = [1, 2, 3, 4, 5] 
>>> b = [] 
>>> [b.append(i) for i in a] 
[None, None, None, None, None] 
>>> print b 
[1, 2, 3, 4, 5] 

o debería evitar lo anterior y utilizar la siguiente vez ?:

for i in a: 
    b.append(i) 

Respuesta

10

Debe efectivamente evitar el uso de listas por comprensión (junto con comprensiones del diccionario, establecido por comprensión y expresiones de generador) para efectos secundarios. Además del hecho de que acumularían una lista falsa y, por lo tanto, desperdiciarían la memoria, también es confuso. Espero una lista de comprensión para generar un valor (significativo), y muchos estarían de acuerdo. Los bucles, por otro lado, son claramente una secuencia de declaraciones. Se espera que den inicio a los efectos secundarios y no generen ningún valor de resultado, nada sorprendente.

2

En el ejemplo que le dan tendría más sentido hacerlo:

b = [i for i in a] 

si por alguna razón quieres crear b. En general, hay algo de sentido común que debe emplearse. Si usar una comprensión hace que tu código no se pueda leer, no lo uses. De lo contrario, ve por ello.

+1

'b = a [:]' también funcionaría ... –

2

Solo use las listas de comprensión si planea usar la lista creada. De lo contrario, créelo solo para que el GC lo arroje de nuevo sin haberlo usado nunca.

Así que en lugar de [b.append(i) for i in a] se debe utilizar una adecuada para el bucle:

for i in a: 
    b.append(i) 

Otra solución sería a través de una expresión generadora:

b += (i for i in a) 

Sin embargo, si desea añadir la toda la lista, simplemente puede hacer

b += a 

Y si sólo tiene que aplicar una función a los elementos antes de añadirlos a la lista, siempre se puede utilizar map:

b += map(somefunc, a) 
+0

Creo que se está centrando demasiado en el ejemplo (de hecho bastante malo). – delnan

+0

Bueno, la pregunta principal se responde desde el principio: el ejemplo es solo para darle al usuario algunas ideas sobre alternativas. – ThiefMaster

0
b = [] 
a = [1, 2, 3, 4, 5] 
b.extend (a) 
Cuestiones relacionadas