[pyar] Remover elementos de una lista mientras se la recorre

Alejandro Santos listas en alejolp.com
Mie Ene 12 10:33:22 ART 2011


2010/12/27 Javier Andrés Mansilla <javimansilla en gmail.com>:
> 2010/12/27 Juanjo Conti <jjconti en gmail.com>:
>> Muchas gracias a todos.
>>
>> 2010/12/27 Claudio Freire <klaussfreire en gmail.com>:
>>> 1) crear una copia de la lista para iterarla:
>>>
>>> for x in list(l):
>>>     l.remove(x)
>>
>> Intentaba evitar esto por que la lista es muy grande, pero parece que
>> no hay otra.
>>
>> Por otro lado comento que simplifiqué el ejemplo, y en realidad borro
>> elementos según una condición.
>>
>
> Sin contestar a tu pregunta, pero mirando el asunto por otro costado,
> no podrías hacer lo que necesitás así:
>
>  l = [x for x in l if condición]
>

(Esta misma pregunta ya se hizo el año pasado[0])

Usar listas por comprension es una buena opción. Puede que no sea muy
intuitivo, pero lo ideal es crear una nueva lista con los valores que
te interesan, en especial porque list.remove() es de O(n) y hacer
remove dentro del for termina siendo O(n**2) (=lento).

Otra alternativa es usar filter():

  l = filter(lambda x: condicion, l)

También ya mencionaron crear una lista a la vieja usanza
(list.append()), eso también funciona.

Hay un caso que no tiene sentido crear una nueva lista y es cuando hay
que eliminar un solo elemento. En ese caso hacer find y remove es
suficiente.

[0] http://proposicion.org.ar/lurker/message/20100521.192726.6409b8b1.en.html

-- 
Alejandro Santos
http://alejolp.com.ar



More information about the pyar mailing list