79

What is the pythonic way of looping through a range of numbers and skipping over one value? For example, the range is from 0 to 100 and I would like to skip 50.

Edit: Here's the code that I'm using

for i in range(0, len(list)):
    x= listRow(list, i)
    for j in range (#0 to len(list) not including x#)
        ...
3
  • The continue statement with a conditional? Commented Jun 6, 2014 at 20:13
  • I could do that but is there any way to get it in the structure of the loop itself? Commented Jun 6, 2014 at 20:15
  • what are you doing in the loop? Commented Jun 6, 2014 at 20:16

11 Answers 11

110

You can use any of these:

# Create a range that does not contain 50
for i in [x for x in xrange(100) if x != 50]:
    print i

# Create 2 ranges [0,49] and [51, 100] (Python 2)
for i in range(50) + range(51, 100):
    print i

# Create a iterator and skip 50
xr = iter(xrange(100))
for i in xr:
    print i
    if i == 49:
        next(xr)

# Simply continue in the loop if the number is 50
for i in range(100):
    if i == 50:
        continue
    print i
Sign up to request clarification or add additional context in comments.

8 Comments

How does (1) create two lists? xrange(100) is not a list. And you can avoid creating the second list by returning a generator instead: for i in (x for x in xrange(100) if x is not 50)
#2 with Python 3.x: ...list(range(50)) + list(range(51, 100)):
@loxosceles or using itertools.chain(range(50), range(51, 100)) instead, to avoid creating lists (although my initial solution is indeed creating 2 lists)
#2 doesn't work in Python 3. The rest are all quite inefficient.
@Acumenus this question is tagged python, not python3. If you have more efficient solutions, please share them so everyone can benefit :)
|
16

In addition to the Python 2 approach here are the equivalents for Python 3:

# Create a range that does not contain 50
for i in [x for x in range(100) if x != 50]:
    print(i)

# Create 2 ranges [0,49] and [51, 100]
from itertools import chain
concatenated = chain(range(50), range(51, 100))
for i in concatenated:
    print(i)

# Create a iterator and skip 50
xr = iter(range(100))
for i in xr:
    print(i)
    if i == 49:
        next(xr)

# Simply continue in the loop if the number is 50
for i in range(100):
    if i == 50:
        continue
    print(i)

Ranges are lists in Python 2 and iterators in Python 3.

Comments

2

If the index of the skipped value is known, it is not necessary to compare each number:

import itertools

m, n = 5, 10
for i in itertools.chain(range(m), range(m + 1, n)):
    print(i)  # skips m = 5

As an aside, you woudn't want to use (*range(m), *range(m + 1, n)) even though it works because it will expand the iterables into a tuple and this is memory inefficient.


Credit: comment by njzk2

Comments

1

If you would like to skip over consecutive numbers where the initial number may be unknown, it is best to use a while loop.

# Loop through a range of numbers from 0 to 100 and skip over number 50 as well
# as the next 3 consecutive numbers (51, 52, 53). Additionally, skip over 11 to 14.

i = 0
initial_skip_num = (50, 11, )
while i < 100:
    if i in initial_skip_num:
        i += 4
    print(i)
    i += 1

Output:

0
1
...
9
10
15
16
...
48
49
54
55
...

This is helpful if the initial number to skip is unknown or multiple consecutive numbers need to be skipped

Comments

1

You can use set.difference:

   list(set.difference(                                                                                                                                              
       set(range(0, 32)),                                                                                                                                         
       set((0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 13, 15, 20, 21))))

result:

Out[37]: [11, 14, 16, 17, 18, 19, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]

Comments

1
for i in range(0, 101):
    if i != 50:
        do sth
    else:
        pass

Comments

0
for i in range(100):
    if i == 50:
        continue
    dosomething

Comments

0

It depends on what you want to do. For example you could stick in some conditionals like this in your comprehensions:

# get the squares of each number from 1 to 9, excluding 2
myList = [i**2 for i in range(10) if i != 2]
print(myList)

# --> [0, 1, 9, 16, 25, 36, 49, 64, 81]

Comments

0

This works for me;

example:

x = ['apple', 'orange', 'grape', 'lion', 'banana', 'watermelon', 'onion', 'cat',]

for xr in x:
    if xr in 'onion':
        print('onion is a vegetable')
        continue
    if (xr not in 'lion' and xr not in 'cat'):
        print(xr, 'is a fruit')

Output -->

apple is a fruit
orange is a fruit
grape is a fruit
banana is a fruit
watermelon is a fruit
onion is a vegetable

Comments

0

There is a set based approach you can use as part of the for-loop or list comprehension whatever, for example:

for x in set(range(100)) - {50}:
    print(x)

Comments

-1

what you could do, is put an if statement around everything inside the loop that you want kept away from the 50. e.g.

for i in range(0, len(list)):
    if i != 50:
        x= listRow(list, i)
        for j in range (#0 to len(list) not including x#)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.