11

对于我正在编写的一些代码,我需要从 1-30 跳过 6 进行迭代。我天真地尝试的是

a = range(1,6)
b = range(7,31)

for i in a+b:
    print i

有没有办法更有效地做到这一点?

4

4 回答 4

18

使用itertools.chain

import itertools

a = range(1,6)
b = range(7,31)

for i in itertools.chain(a, b):
    print i

或者棘手的扁平化生成器表达式:

a = range(1,6)
b = range(7,31)
for i in (x for y in (a, b) for x in y):
    print i

或跳过生成器表达式:

skips = set((6,))
for i in (x for x in range(1, 31) if x not in skips):
    print i

其中任何一个都适用于任何可迭代对象,而不仅仅是rangePython 3lists中的 s 或 Python 2 中的 s。

于 2013-08-19T15:50:33.183 回答
13

在 python 2 中,您没有组合“范围函数”;这些只是列表。您的示例效果很好。但是 range 总是在内存中创建一个完整的列表,所以如果只在 for 循环中需要,更好的方法可能是使用生成器表达式和 xrange:

range_with_holes = (j for j in xrange(1, 31) if j != 6)

for i in range_with_holes:
    ....

在生成器表达式中,if 部分可以包含要跳过的数字的复杂逻辑。

组合可迭代对象的另一种方法是使用itertools.chain

range_with_holes = itertools.chain(xrange(1, 6), xrange(7, 31))

或者只是跳过不需要的索引

for i in range(1, 31):
    if i == 6:
        continue

    ...
于 2013-08-19T15:50:52.710 回答
2

一种选择是使用跳过列表,并对其进行检查,例如:

skips = [6, 42]
for i in range(1,31):
   if i in skips:
      continue
   print i
于 2013-08-19T15:50:30.923 回答
0

我使用列表转换:

>>> list(range(10,13)) + list(range(1,5))
[10, 11, 12, 1, 2, 3, 4]
于 2022-02-13T17:25:12.673 回答