Sauter plusieurs itérations dans la boucle python
j'ai une liste dans une boucle et je veux sauter 3 éléments après look
a été atteint.
Dans cette réponse quelques suggestions ont été faites, mais je n'en fais pas bon usage:
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
quatre fois continue
est un non-sens bien sûr et utiliser quatre fois next()
ne fonctionne pas.
la sortie devrait ressembler à:
always
look
aside
of
life
6 réponses
for
utilise iter(song)
pour boucler la boucle; vous pouvez le faire dans votre propre code et ensuite faire avancer l'itérateur à l'intérieur de la boucle; appeler iter()
sur le itérable de nouveau ne retournera que le même objet itérable de sorte que vous pouvez avancer l'itérable à l'intérieur de la boucle avec for
suivant tout au long de la prochaine itération.
avance l'itérateur avec la next()
fonction ; il fonctionne correctement en Python 2 et 3 sans devoir ajuster la syntaxe:
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)
en déplaçant la ligne print sing
nous pouvons éviter de nous répéter aussi.
utilisant next()
de cette façon peut soulever une StopIteration
exception, si l'itérable est hors des valeurs.
vous pourriez attraper cette exception, mais il serait plus facile de donner next()
un deuxième argument, une valeur par défaut pour ignorer l'exception et retourner la valeur par défaut à la place:
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, '')
j'utiliserais itertools.islice()
pour sauter 3 éléments à la place; sauve des appels répétés 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), '')
le islice(song_iter, 3, 4)
itérable sautera 3 éléments, puis retournera le 4, puis sera fait. En appelant next()
sur cet objet, on récupère ainsi le 4e élément de song_iter()
.
Démo:
>>> 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
je pense, c'est très bien d'utiliser des itérateurs et next
ici:
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
ou, avec la gestion des exceptions (qui est plus courte ainsi que plus robuste que @Steinar remarqué):
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
bien sûr, vous pouvez utiliser trois fois suivante (ici, j'ai fait faire quatre fois)
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
puis
always
look
aside
of
life
en fait, en utilisant .next() trois fois n'est pas absurde. Quand vous voulez sauter des valeurs n, appelez next() n+1 fois (n'oubliez pas d'attribuer la valeur du dernier appel à quelque chose) et ensuite "call" continuer.
Pour obtenir une réplique exacte du code que vous avez posté:
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
vous pouvez le faire sans iter () en utilisant simplement une variable supplémentaire:
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