在0到k-1的整数中进行“Pythonic”循环,排除i

6 投票
5 回答
3360 浏览
提问于 2025-04-18 17:59

我想创建一个循环,这个循环会遍历从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)):
    # ...

撰写回答