How to use more than one condition in Python for loop?

The direct equivalent of your Java code is a while loop:

n = [1, 2, 3, 4, 6, 7]
i = 0
while i < len(n) and i < 5:
    # do sth
    i += 1

You could also do:

n = [1, 2, 3, 4, 6, 7]
for x in n[:5]:
    # do sth

The Python for loop does not, itself, have any support for this. You can get the same effect using a break statement:

n = [1, 2, 3, 4, 6, 7]

for i in n:
    if i >= 5:
        break
    # do something with i

In Python, a for is really a foreach that iterates over some "iterator" or some "iterable object". This is even true when you just want to repeat a specific number of times:

for i in range(1, 8):
    # do something with i

In Python 2.x, the above for loop builds a list with the numbers 1 through 7 inclusive, then iterates over the list; in Python 3.x, the above loop gets an "iterator object" that yields up the values 1 through 7 inclusive, one at a time. (The difference is in the range() function and what it returns. In Python 2.x you can use xrange() to get an iterator object instead of allocating a list.)

If you already have a list to iterate over, it is good Python to iterate over it directly rather than using a variable i to index the list. If you still need an index variable you can get it with enumerate() like so:

n = [3, 5, 10, "cat", "dog", 3.0, 4.0]  # list can contain different types
for i, value in enumerate(n):
    # we only want to process the first 5 values in this list
    if i >= 5:
        break
    # do something with value

EDIT: An alternate way to solve the above problem would be to use list slicing.

for value in n[:5]:
    # do something with value

This works if n is a list. The for loop will set value to successive items from the list, stopping when the list runs out or 5 items have been handled, whichever comes first. It's not an error to request a slice of longer length than the actual list.

If you want to use the above technique but still allow your code to work with iterators, you can use itertools.islice():

from itertools import islice

for value in islice(n, 5):
    # do something with value

This will work with a list, an iterator, a generator, any sort of iterable.

And, as with list slicing, the for loop will get up to 5 values and it's not an error to request an islice() longer than the number of values the iterable actually has.

Tags:

Python