Reputation: 1438
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#)
...
Upvotes: 79
Views: 212679
Reputation: 1225
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)
Upvotes: 0
Reputation: 29
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]
Upvotes: 1
Reputation: 337
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
Upvotes: 1
Reputation: 63272
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
Upvotes: 2
Reputation: 772
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
Upvotes: 0
Reputation: 527
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.
Upvotes: 16
Reputation: 39386
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
Upvotes: 110
Reputation: 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#)
Upvotes: -1
Reputation: 19506
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]
Upvotes: 0