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