Python – ¿Cómo reiniciar un bucle for, similar a “continuar” para los bucles while?

Básicamente, necesito una forma de devolver el control al principio de un bucle for y, de hecho, reiniciar todo el proceso de iteración después de realizar una acción si se cumple una determinada condición.

Lo que estoy tratando de hacer es esto:

for index, item in enumerate(list2): if item == '||' and list2[index-1] == '||': del list2[index] ** 

De esa manera, si [‘berry’, ‘||’, ‘||’, ‘||’, ‘pancake] está dentro de la lista, terminaré con:

[‘berry’, ‘||’, ‘pancake’] en su lugar.

¡Gracias!

No estoy seguro de lo que quieres decir con “reiniciar”. ¿Desea iniciar la iteración desde el principio o simplemente omitir la iteración actual?

Si es lo último, entonces la compatibilidad con los bucles continue igual while bucles:

 for i in xrange(10): if i == 5: continue print i 

Lo anterior imprimirá los números del 0 al 9, excepto el 5.

Si está hablando de comenzar desde el principio del bucle for , no hay forma de hacerlo excepto “manualmente”, por ejemplo, envolviéndolo en un bucle while:

 should_restart = True while should_restart: should_restart = False for i in xrange(10): print i if i == 5: should_restart = True break 

Lo anterior imprimirá los números del 0 al 5, luego volverá a comenzar desde el 0, y así sucesivamente de manera indefinida (no es un gran ejemplo, lo sé).

 while True: for i in xrange(10): if condition(i): break else: break 

Eso hará lo que pareces querer. Por qué querrías hacerlo es un asunto diferente. Tal vez debería echar un vistazo a su código y asegurarse de que no está perdiendo una forma obvia y fácil de hacerlo.

Una acción que reinicia todo el proceso.

Una mala manera de pensar en un algoritmo.

Sólo estás filtrando, es decir, eliminando duplicados.

Y, en Python, eres más feliz haciendo copias, no tratando de hacer del . En general, hay muy poca llamada para usar del .

 def unique( some_list ): list_iter= iter(some_list) prev= list_iter.next() for item in list_iter: if item != prev: yield prev prev= item yield prev list( unique( ['berry','||','||','||','pancake'] ) ) 

La inevitable versión de itertools, porque me vino a la cabeza:

 from itertools import groupby def uniq(seq): for key, items in groupby(seq): yield key print list(uniq(['berry','||','||','||','pancake'])) # ['berry','||', 'pancake'] # or simply: print [key for key, items in groupby(['berry','||','||','||','pancake'])] 

Continue funcionará para cualquier bucle.

continue trabajos en bucles también.

 >>> for i in range(3): ... print 'Before', i ... if i == 1: ... continue ... print 'After', i ... Before 0 After 0 Before 1 # After 1 is missing Before 2 After 2 

Como puede ver, responder a su pregunta conduce a un código bastante complicado. Por lo general, se puede encontrar una mejor manera, por lo que tales construcciones no están integradas en el lenguaje

Si no se siente cómodo usando itertools, considere usar este bucle en su lugar. No solo es más fácil de seguir que su reinicio de bucle, sino que también es más eficiente porque no pierde tiempo en volver a verificar los elementos que ya se han pasado.

 L = ['berry','||','||','||','pancake'] idx=1 while idx 
 def remove_adjacent(nums): return [a for a,b in zip(nums, nums[1:]+[not nums[-1]]) if a != b] example = ['berry','||','||','||','pancake'] example = remove_adjacent(example) print example """ Output: ['berry', '||', 'pancake'] """ 

Y, por cierto, esto se repite al eliminar elementos duplicados adyacentes de una lista.