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 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), '')
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), '')
...
always
look
aside
of
life