How can I combine range() functions

冷暖自知 提交于 2019-11-30 09:15:02

问题


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 ranges in Python 3 or listss 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!