eyed3 python list iterator loops

python - eyed3 - Modificar la lista al iterar



eyed3 python (7)

Esta sintaxis de segmento hace una copia de la lista y hace lo que desea:

l = range(100) for i in l[:]: print i, print l.pop(0), print l.pop(0)

Esta pregunta ya tiene una respuesta aquí:

l = range(100) for i in l: print i, print l.pop(0), print l.pop(0)

El código python anterior da la salida bastante diferente de lo esperado. Quiero recorrer los elementos para poder omitir un elemento mientras hago bucles.

Por favor explique.


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

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


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

Puede usar el operador de mylist[::3] para saltar a cada tercer elemento 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 .

  • Uso una lista de comprensión para definir mylist porque funciona en Python 3.0 (ver a continuación)
  • imprimir es una función en python 3.0

El rango de Python 3.0 () ahora se comporta como xrange () usado para comportarse, excepto que funciona con valores de tamaño arbitrario. El último ya no existe.


Nunca modifiques el contenedor en el que estás haciendo bucles, porque los iteradores en ese contenedor no serán informados de tus alteraciones y, como habrás notado, es muy probable que produzcan un bucle 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 patas del bucle y si intenta volver a abrirlo obtendrá una excepción.

¿Qué es más PERO claro, qué comportamiento estás tratando de lograr, si hay alguno? ¿Tal vez 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)


Prueba esto. Evita la mutación de una cosa que estás iterando, que generalmente es un olor a código.

for i in xrange(0, 100, 3): print i

Ver xrange .


Supongo que esto es lo que quieres:

l = range(100) index = 0 for i in l: print i, try: print l.pop(index+1), print l.pop(index+1) except: pass index += 1

Es bastante útil codificar cuando la cantidad de elementos que se van a extraer es una decisión de tiempo de ejecución. Pero funciona con muy mala eficiencia y el código es difícil de mantener.


Use un ciclo while que verifica la veracidad de la matriz:

while array: value = array.pop(0) # do some calculation here

Y debería hacerlo sin ningún error o comportamiento divertido.