web-dev-qa-db-fra.com

Ignorer plusieurs itérations dans la boucle python

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
36
Mehdi Nellen

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
46
Martijn Pieters
>>> 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
6
demo.b

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
4
bereal

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
2
SaeX

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
2
radomaj

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
2
hivert