Borrar los elementos de la lista in-situ es posible, pero no avanzando en la lista. Su código simplemente no funciona: a medida que la lista se reduce, puede perder elementos de examen. Tienes que ir hacia atrás, para que la parte que se encoge esté detrás de ti, con un código bastante horrible. Antes de mostrarle eso, hay algunas consideraciones preliminares:
Primero, ¿cómo llegó esa basura a la lista? Es mejor prevenir que curar.
En segundo lugar, ¿cuántos elementos de la lista y qué porcentaje es probable que necesiten borrarse? Cuanto mayor sea el porcentaje, mayor es la probabilidad de que sea mejor crear una nueva lista.
bien, si todavía quiere hacerlo in situ, contemplar este:
def list_cleanup_fail(alist, is_bad):
i = 0
for element in alist:
print "i=%d alist=%r alist[i]=%d element=%d" % (i, alist, alist[i], element)
if is_bad(element):
del alist[i]
i += 1
def list_cleanup_ok(alist, is_bad):
for i in xrange(len(alist) - 1, -1, -1):
print "i=%d alist=%r alist[i]=%d" % (i, alist, alist[i])
if is_bad(alist[i]):
del alist[i]
def is_not_mult_of_3(x):
return x % 3 != 0
for func in (list_cleanup_fail, list_cleanup_ok):
print
print func.__name__
mylist = range(11)
func(mylist, is_not_mult_of_3)
print "result", mylist
y aquí está la salida:
list_cleanup_fail
i=0 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=0 element=0
i=1 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=1 element=1
i=2 alist=[0, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=3 element=3
i=3 alist=[0, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=4 element=4
i=4 alist=[0, 2, 3, 5, 6, 7, 8, 9, 10] alist[i]=6 element=6
i=5 alist=[0, 2, 3, 5, 6, 7, 8, 9, 10] alist[i]=7 element=7
i=6 alist=[0, 2, 3, 5, 6, 8, 9, 10] alist[i]=9 element=9
i=7 alist=[0, 2, 3, 5, 6, 8, 9, 10] alist[i]=10 element=10
result [0, 2, 3, 5, 6, 8, 9]
list_cleanup_ok
i=10 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] alist[i]=10
i=9 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] alist[i]=9
i=8 alist=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] alist[i]=8
i=7 alist=[0, 1, 2, 3, 4, 5, 6, 7, 9] alist[i]=7
i=6 alist=[0, 1, 2, 3, 4, 5, 6, 9] alist[i]=6
i=5 alist=[0, 1, 2, 3, 4, 5, 6, 9] alist[i]=5
i=4 alist=[0, 1, 2, 3, 4, 6, 9] alist[i]=4
i=3 alist=[0, 1, 2, 3, 6, 9] alist[i]=3
i=2 alist=[0, 1, 2, 3, 6, 9] alist[i]=2
i=1 alist=[0, 1, 3, 6, 9] alist[i]=1
i=0 alist=[0, 3, 6, 9] alist[i]=0
result [0, 3, 6, 9]
Creo que se dará cuenta de que esta línea de pensamiento es más problemas de lo que vale. Solo copie la lista, modifíquela y devuelva la copia modificada. Modificar una lista en su lugar mientras se itera es solo pedir dolores de cabeza. – jathanism
'del' es una declaración, no una función. No envuelva su argumento entre paréntesis. – jemfinch
El tamaño del objeto "en la lista" es irrelevante ya que Python no está almacenando el objeto en la lista; está almacenando una referencia al objeto.Por lo tanto, los problemas de rendimiento están relacionados con la longitud de la lista y el algoritmo utilizado para operar en la lista en lugar del tamaño de los objetos a los que se hace referencia. – Nathan