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
32
demandé sur Community 2014-03-10 13:05:34

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
38
répondu Martijn Pieters 2014-03-10 09:25:18
>>> 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
5
répondu demo.b 2014-03-10 09:33:04

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
4
répondu bereal 2014-03-10 14:48:16

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
2
répondu hivert 2014-03-10 09:11:02

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
2
répondu radomaj 2014-03-10 09:18:18

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
2
répondu SaeX 2014-03-10 09:22:35