问题
For some code I'm writing, I need to iterate from 1-30 skipping 6. What I tried naively is
a = range(1,6)
b = range(7,31)
for i in a+b:
print i
Is there a way to do it more efficiently?
回答1:
In python 2 you are not combining "range functions"; these are just lists. Your example works just well. But range always creates a full list in memory, so a better way if only needed in for loop could be to to use a generator expression and xrange:
range_with_holes = (j for j in xrange(1, 31) if j != 6)
for i in range_with_holes:
....
In generator expression the if part can contain a complex logic on which numbers to skip.
Another way to combine iterables is to use the itertools.chain
:
range_with_holes = itertools.chain(xrange(1, 6), xrange(7, 31))
Or just skip the unwanted index
for i in range(1, 31):
if i == 6:
continue
...
回答2:
Use itertools.chain:
import itertools
a = range(1,6)
b = range(7,31)
for i in itertools.chain(a, b):
print i
Or tricky flattening generator expressions:
a = range(1,6)
b = range(7,31)
for i in (x for y in (a, b) for x in y):
print i
Or skipping in a generator expression:
skips = set((6,))
for i in (x for x in range(1, 31) if x not in skips):
print i
Any of these will work for any iterable(s), not just range
s in Python 3 or lists
s in Python 2.
回答3:
One option would be to use a skip list, and check against that, with something like:
skips = [6, 42]
for i in range(1,31):
if i in skips:
continue
print i
来源:https://stackoverflow.com/questions/18317913/how-can-i-combine-range-functions