对于我正在编写的一些代码,我需要从1-30跳过迭代6.我天真地尝试的是
a = range(1,6)
b = range(7,31)
for i in a+b:
print i
Run Code Online (Sandbox Code Playgroud)
有没有办法更有效地做到这一点?
agf*_*agf 14
import itertools
a = range(1,6)
b = range(7,31)
for i in itertools.chain(a, b):
print i
Run Code Online (Sandbox Code Playgroud)
或者狡猾的展平生成器表达式:
a = range(1,6)
b = range(7,31)
for i in (x for y in (a, b) for x in y):
print i
Run Code Online (Sandbox Code Playgroud)
或者跳过生成器表达式:
skips = set((6,))
for i in (x for x in range(1, 31) if x not in skips):
print i
Run Code Online (Sandbox Code Playgroud)
其中任何一个都适用于任何迭代,而不仅仅是rangePython 3中的listss 或Python 2中的s.
Ant*_*ala 12
在python 2中,你没有组合"范围函数"; 这些只是列表.你的例子效果很好.但是range总是在内存中创建一个完整的列表,所以如果只需要for循环就可以使用生成器表达式和xrange更好的方法:
range_with_holes = (j for j in xrange(1, 31) if j != 6)
for i in range_with_holes:
....
Run Code Online (Sandbox Code Playgroud)
在生成器表达式中,if部分可以包含要跳过的数字的复杂逻辑.
组合iterables的另一种方法是使用itertools.chain:
range_with_holes = itertools.chain(xrange(1, 6), xrange(7, 31))
Run Code Online (Sandbox Code Playgroud)
或者只是跳过不需要的索引
for i in range(1, 31):
if i == 6:
continue
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7503 次 |
| 最近记录: |