Modificar la lista mientras se itera [duplicar]

Resuelto Xolve asked hace 14 años • 7 respuestas
l  = range(100)                         
for i in l:                         
    print i,                         
    print l.pop(0),                  
    print l.pop(0)

El código Python anterior proporciona un resultado bastante diferente al esperado. Quiero recorrer elementos para poder omitir un elemento mientras hago el bucle.

Por favor explique.

Xolve avatar Oct 28 '09 21:10 Xolve
Aceptado

Nunca modifique el contenedor en el que está realizando el bucle, porque los iteradores de ese contenedor no serán informados de sus modificaciones y, como habrá notado, es muy probable que eso produzca un bucle muy diferente y/o uno incorrecto. En casos normales, hacer un bucle en una copia del contenedor ayuda, pero en su caso está claro que no quiere eso, ya que el contenedor estará vacío después de 50 tramos del bucle y si luego intenta hacer estallar nuevamente obtendrá una excepción.

Lo que no está claro es: ¿qué comportamiento estás tratando de lograr, si es que hay alguno? ¿ Quizás puedas expresar tus deseos con un while...?

i = 0
while i < len(some_list):
    print i,                         
    print some_list.pop(0),                  
    print some_list.pop(0)
Alex Martelli avatar Oct 28 '2009 15:10 Alex Martelli

Me ha picado antes el código "inteligente" (de otra persona) que intenta modificar una lista mientras la itera. Resolví que nunca lo haría bajo ninguna circunstancia.

Puede utilizar el operador de división mylist[::3]para saltar a uno de cada tres elementos de su lista.

mylist = [i for i in range(100)]
for i in mylist[::3]:
    print(i)

Otros puntos sobre mi ejemplo se relacionan con la nueva sintaxis en Python 3.0 .

  • Utilizo una lista por comprensión para definir mylist porque funciona en Python 3.0 (ver más abajo)
  • imprimir es una función en Python 3.0

Python 3.0 range() ahora se comporta como solía comportarse xrange(), excepto que funciona con valores de tamaño arbitrario. Este último ya no existe.

Ewan Todd avatar Oct 28 '2009 15:10 Ewan Todd

La regla general es que no se modifica una colección/matriz/lista mientras se itera sobre ella.

Utilice una lista secundaria para almacenar los elementos sobre los que desea actuar y ejecute esa lógica en un bucle después del bucle inicial.

Paul Sasik avatar Oct 28 '2009 15:10 Paul Sasik