¿Cómo elimino un elemento de una lista si coincide con una subcadena?Eliminar un elemento de la lista que coincide con una subcadena - Python
He intentado quitar un elemento de una lista utilizando el método pop()
y enumerate
pero parece que me estoy perdiendo un par de elementos contiguos que necesita ser eliminado:
sents = ['@$\tthis sentences needs to be removed', 'this doesnt',
'@$\tthis sentences also needs to be removed',
'@$\tthis sentences must be removed', 'this shouldnt',
'# this needs to be removed', 'this isnt',
'# this must', 'this musnt']
for i, j in enumerate(sents):
if j[0:3] == "@$\t":
sents.pop(i)
continue
if j[0] == "#":
sents.pop(i)
for i in sents:
print i
Salida:
this doesnt
@$ this sentences must be removed
this shouldnt
this isnt
#this should
this musnt
salida deseada:
this doesnt
this shouldnt
this isnt
this musnt
Caso clásico de eliminación de elementos de una lista mientras itera sobre esa lista. Lea las docenas de otras preguntas sobre el desbordamiento de pila que se relacionan con esto. Además, consulte la [nota en los documentos] (http://docs.python.org/reference/compound_stmts.html#for). –
siempre debe evitar cambiar la longitud de un contenedor mientras lo itera, esta es una receta para el desastre – wim
En general, generalmente es mejor crear una nueva lista filtrada que intentar modificar una lista en contexto. Los algoritmos inmutables siempre son más fáciles de razonar (aunque no siempre es más fácil descifrar cómo escribir). Cuando solo está reemplazando valores, a veces las ganancias de eficiencia de trabajar in situ superan eso, pero cuando está eliminando o insertando en el medio de una lista, por lo general está obteniendo _worse_ efficiency junto con su lógica menos robusta. – abarnert