在0到k-1的整数中进行“Pythonic”循环,排除i
我想创建一个循环,这个循环会遍历从0到k-1的整数,但不包括整数i。(我在比较一些包含k个项目的列表,而我不需要将一个列表中的第i个项目与另一个列表中的第i个项目进行比较。)
我有一个比较简单的方法来实现这个,但我总觉得还有一种更“Pythonic”(更符合Python风格)的优雅方式。
我现在的做法是:
tocheck = range(k)
del(tocheck[i])
for j in tocheck:
这样做其实挺简单的,但我喜欢Python的一点就是,它似乎总有一些聪明的一行代码的“Pythonic”技巧可以用来解决这类问题。
谢谢。
5 个回答
1
另一种可能的方法是直接使用迭代器:
from itertools import chain
k = 10
l = range(k)
i = 2
print [el for el in iter(l[:i])] + [el for el in iter(l[i+1:])]
这个方法适用于任何列表 l
。如果 l
只是一个简单的 range
,你可以省略对 l
的明确定义,直接写:
print [el for el in xrange(i)] + [el for el in xrange(i+1,k)]
2
这样怎么样:
for l in (j for j in range(k) if j != i):
....
这里用到了生成器表达式,这种写法在Python中比较常见,被认为是“Python风格”。不过,这个表达式本身有点复杂,可能让人觉得不太优雅。
4
我觉得在循环中留个空隙,最简单的方法就是用 continue
跳过当前这次循环。
i = 20
for j in range(50):
if j==i:
continue
print j
4
我觉得我会选择其中一个:
for j in range(k):
if j == i: continue
...code here...
或者(固定的)
tocheck = range(k)
for j in tocheck[:i] + tocheck[i + 1:]:
...code here...
或者
for j in range(i) + range(i + 1, k):
...code here...
11
也许可以使用 itertools.chain
这个工具。
from itertools import chain
for j in chain(range(i), range(i+1, k)):
# ...