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#) ... 38 Answers
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 9In 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.
It is time inefficient to compare each number, needlessly leading to a linear complexity. Having said that, this approach avoids any inequality checks:
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, answer by Locke
for i in range(0, 101): if i != 50: do sth else: pass for i in range(100): if i == 50: continue dosomething 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] 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 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#)