¿Cómo eliminar un elemento de una lista mientras se itera en Python?

Supongamos que tengo una lista de números:

L = [1, 2, 3, 4, 5] 

¿Cómo elimino un elemento, digamos 3, de la lista mientras lo itero?

Probé el siguiente código pero no lo hice:

 for el in L: if el == 3: del el 

¿Algunas ideas?

Gracias, Boda Cydo.

Por lo general, lo mejor es proceder de manera constructiva: cree la nueva lista de los elementos que desea en lugar de eliminar los que no. P.ej:

 L[:] = [el for el in L if el != 3] 

la lista de comprensión crea la lista deseada y la asignación a la “porción de lista completa”, L[:] , asegúrate de que no solo estás volviendo a unir un nombre, sino que también reemplazas el contenido por completo, por lo que los efectos son idénticos a los “retiros” “querías realizar. Esto también es rápido.

Si absolutamente, a cualquier costo, debe hacer eliminaciones en su lugar, un enfoque sutil podría funcionar:

 >>> ndel = 0 >>> for i, el in enumerate(list(L)): ... if el==3: ... del L[i-ndel] ... ndel += 1 

en ningún lugar tan elegante, limpio, simple o con un buen rendimiento como el enfoque de la lista compacta, pero hace el trabajo (aunque su corrección no es obvia a primera vista y, de hecho, ¡estaba mal antes de una edición!). “a cualquier costo” se aplica aquí ;-).

El bucle de índices en lugar de elementos es otro enfoque inferior pero viable para el caso de “debe hacer eliminaciones”, pero recuerde invertir los índices en este caso …:

 for i in reversed(range(len(L))): if L[i] == 3: del L[i] 

de hecho, este fue un caso de uso primario para el retroceso cuando estábamos debatiendo si agregarlo incorporado – reversed(range(... no es trivial obtener sin reversed , y hacer un bucle en la lista en orden inverso es a veces Útil. La alternativa.

 for i in range(len(L) - 1, -1, -1): 

Es realmente fácil equivocarse ;-).

Aún así, la lista que recomendé al comienzo de esta respuesta se ve mejor y mejor a medida que se examinan las alternativas, ¿no? -).

 for el in L: if el == 2: del L[el]