Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I skip a few iterations in a for loop

Tags:

python

loops

In python I usually loop through ranges simply by

for i in range(100): 
    #do something

but now I want to skip a few steps in the loop. More specifically, I want something like continue(10) so that it would skip the whole loop and increase the counter by 10. If I were using a for loop in C I'd just sum 10 to i, but in Python that doesn't really work.

like image 941
Alex S Avatar asked Jul 24 '13 14:07

Alex S


People also ask

How do you skip multiple iterations in Python?

Using next() this way can raise a StopIteration exception, if the iterable is out of values. 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() .

How do you skip part of a code in Python?

Just add # at the beginning of all the lines you want to skip.


3 Answers

You cannot alter the target list (i in this case) of a for loop. Use a while loop instead:

while i < 10:     i += 1     if i == 2:         i += 3 

Alternatively, use an iterable and increment that:

from itertools import islice  numbers = iter(range(10)) for i in numbers:     if i == 2:         next(islice(numbers, 3, 3), None)  # consume 3 

By assigning the result of iter() to a local variable, we can advance the loop sequence inside the loop using standard iteration tools (next(), or here, a shortened version of the itertools consume recipe). for normally calls iter() for us when looping over a iterator.

like image 194
Martijn Pieters Avatar answered Sep 22 '22 03:09

Martijn Pieters


The best way is to assign the iterator a name - it is common have an iterable as opposed to an iterator (the difference being an iterable - for example a list - starts from the beginning each time you iterate over it). In this case, just use the iter() built-in function:

numbers = iter(range(100)) 

Then you can advance it inside the loop using the name. The best way to do this is with the itertools consume() recipe - as it is fast (it uses itertools functions to ensure the iteration happens in low-level code, making the process of consuming the values very fast, and avoids using up memory by storing the consumed values):

from itertools import islice import collections  def consume(iterator, n):     "Advance the iterator n-steps ahead. If n is none, consume entirely."     # Use functions that consume iterators at C speed.     if n is None:         # feed the entire iterator into a zero-length deque         collections.deque(iterator, maxlen=0)     else:         # advance to the empty slice starting at position n         next(islice(iterator, n, n), None) 

By doing this, you can do something like:

numbers = iter(range(100)) for i in numbers:      ...     if some_check(i):         consume(numbers, 3)  # Skip 3 ahead. 
like image 32
Gareth Latty Avatar answered Sep 26 '22 03:09

Gareth Latty


Why not just set the value to skip until? Like:

skip_until = 0
for i in range(100):
    if i < skip_until:
        continue
    if SOME_CONDITION:
        skip_until = i + 10
    DO_SOMETHING()

where SOME_CONDITION is whatever causes you to skip and DO_SOMETHING() is the actual loop contents?

like image 23
Josh Buell Avatar answered Sep 25 '22 03:09

Josh Buell