Skip multiple iterations in loop
for
uses iter(song)
to loop; you can do this in your own code and then advance the iterator inside the loop; calling iter()
on the iterable again will only return the same iterable object so you can advance the iterable inside the loop with for
following right along in the next iteration.
Advance the iterator with the next()
function; it works correctly in both Python 2 and 3 without having to adjust syntax:
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)
By moving the print sing
line up we can avoid repeating ourselves too.
Using next()
this way can raise a StopIteration
exception, if the iterable is out of values.
You could catch that exception, but it'd be easier to give next()
a second argument, a default value to ignore the exception and return the default instead:
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, '')
I'd use itertools.islice()
to skip 3 elements instead; saves repeated next()
calls:
from itertools import islicesong = ['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), '')
The islice(song_iter, 3, 4)
iterable will skip 3 elements, then return the 4th, then be done. Calling next()
on that object thus retrieves the 4th element from song_iter()
.
Demo:
>>> 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), '')... alwayslookasideoflife
>>> 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 += 1Output:alwayslookasideoflife
I think, it's just fine to use iterators and next
here:
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
or, with exception handling (which is shorter as well as more robust as @Steinar noticed):
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