while terminar sintaxis for español ejemplos como ciclo bucle python loops iterator next continue

terminar - Omita múltiples iteraciones en el ciclo python



for i in range python español (6)

Tengo una lista en un bucle y quiero omitir 3 elementos después de que se haya alcanzado la look . En esta respuesta se hicieron un par de sugerencias, pero no puedo hacer un buen uso de ellas:

song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] for sing in song: if sing == ''look'': print sing continue continue continue continue print ''a'' + sing print sing

Seguir cuatro veces es una tontería, por supuesto, y usar cuatro veces a next() no funciona.

La salida debería verse así:

always look aside of life


Creo que está bien usar iteradores y el next aquí:

song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] it = iter(song) while True: word = next(it, None) if not word: break print word if word == ''look'': for _ in range(4): # skip 3 and take 4th word = next(it, None) if word: print ''a'' + word

o, con manejo de excepciones (que es más corto y más robusto como lo notó @Steinar):

it = iter(song) while True: try: word = next(it) print word if word == ''look'': for _ in range(4): word = next(it) print ''a'' + word except StopIteration: break


En realidad, usar .next () tres veces no es una tontería. Cuando quiera omitir n valores, llame a next () n + 1 veces (no olvide asignar el valor de la última llamada a algo) y luego "call" continúe.

Para obtener una réplica exacta del código que publicó:

song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] songiter = iter(song) for sing in songiter: if sing == ''look'': print sing songiter.next() songiter.next() songiter.next() sing = songiter.next() print ''a'' + sing continue print sing


Por supuesto, puede usar tres veces a continuación (aquí en realidad lo hago cuatro veces)

song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] it = iter(song) for sing in it: if sing == ''look'': print sing try: sing = it.next(); sing = it.next(); sing = it.next(); sing=it.next() except StopIteration: break print ''a''+sing else: print sing

Entonces

always look aside of life


Puede hacer esto sin un iter () simplemente usando una variable extra:

skipcount = -1 song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] for sing in song: if sing == ''look'' and skipcount <= 0: print sing skipcount = 3 elif skipcount > 0: skipcount = skipcount - 1 continue elif skipcount == 0: print ''a'' + sing skipcount = skipcount - 1 else: print sing skipcount = skipcount - 1


for usos iter(song) para loop; puede hacer esto en su propio código y luego avanzar el iterador dentro del ciclo; Invocar iter() en el iterable de nuevo solo devolverá el mismo objeto iterable para que pueda avanzar el iterable dentro del bucle con el siguiente en la próxima iteración.

Avance el iterador con la next() función next() ; funciona correctamente en Python 2 y 3 sin tener que ajustar la sintaxis:

song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] song_iter = iter(song) for sing in song_iter: print sing if sing == ''look'': next(song_iter) next(song_iter) next(song_iter) print ''a'' + next(song_iter)

Al mover la línea de print sing , podemos evitar repetirnos a nosotros mismos también.

Usar next() esta manera puede generar una excepción StopIteration , si el iterable está StopIteration de valores.

Podría atrapar esa excepción, pero sería más fácil darle a next() un segundo argumento, un valor predeterminado para ignorar la excepción y devolver el valor predeterminado en su lugar:

song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] song_iter = iter(song) for sing in song_iter: print sing if sing == ''look'': next(song_iter, None) next(song_iter, None) next(song_iter, None) print ''a'' + next(song_iter, '''')

Yo usaría itertools.islice() para omitir 3 elementos; guarda repetidas llamadas next() :

from itertools import islice song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] song_iter = iter(song) for sing in song_iter: print sing if sing == ''look'': print ''a'' + next(islice(song_iter, 3, 4), '''')

El islice(song_iter, 3, 4) iterable omitirá 3 elementos, luego regresará el 4 y luego se terminará. next() llamar a next() en ese objeto, se recupera el 4 ° elemento de song_iter() .

Manifestación:

>>> from itertools import islice >>> song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] >>> song_iter = iter(song) >>> for sing in song_iter: ... print sing ... if sing == ''look'': ... print ''a'' + next(islice(song_iter, 3, 4), '''') ... always look aside of life


>>> song = [''always'', ''look'', ''on'', ''the'', ''bright'', ''side'', ''of'', ''life''] >>> count = 0 >>> while count < (len(song)): if song[count] == "look" : print song[count] count += 4 song[count] = ''a'' + song[count] continue print song[count] count += 1 Output: always look aside of life