J'ai une liste dans une boucle et je veux ignorer 3 éléments après que look
a été atteint. Dans cette réponse quelques suggestions ont été faites mais je ne les utilise pas à bon escient:
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 doit ressembler à:
always
look
aside
of
life
for
utilise iter(song)
pour boucler; vous pouvez le faire dans votre propre code, puis faire avancer l'itérateur dans la boucle; appeler à nouveau iter()
sur l'itérable ne renverra que le même objet itérable afin que vous puissiez faire avancer l'itérable à l'intérieur de la boucle avec for
suivant tout au long de l'itération suivante.
Avancez l'itérateur avec la fonction next()
; il fonctionne correctement dans les deux Python 2 et 3 sans avoir à 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 également éviter de nous répéter.
L'utilisation de next()
de cette façon peut déclencher une exception StopIteration
, si l'itérable est hors des valeurs.
Vous pouvez intercepter 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 ignorer 3 éléments à la place; enregistre les appels répétés de 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), '')
La islice(song_iter, 3, 4)
itérable sautera 3 éléments, puis renverra le 4ème, puis aura terminé. L'appel de next()
sur cet objet récupère ainsi le 4ème é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 que 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 une gestion des exceptions (qui est plus courte et plus robuste que @Steinar l'a 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
Vous pouvez le faire sans iter () aussi simplement en utilisant 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
En fait, utiliser trois fois .next () n'est pas absurde. Lorsque vous voulez ignorer n valeurs, appelez next () n + 1 fois (n'oubliez pas d'attribuer la valeur du dernier appel à quelque chose), puis "call" continuez.
Pour obtenir une réplique exacte du code que vous avez publié:
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
Bien sûr, vous pouvez utiliser trois fois ensuite (ici, je le fais 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
Alors
always
look
aside
of
life