我需要遍历一个索引元组。所有索引必须在范围[0, N)
内,并满足条件i > j
。我在这里提供了一个简单的示例,只涉及两个索引;我需要将其扩展到三个(具有i > j > k
)或更多。
基本版本如下:
N = 5
for i in range(N):
for j in range(i):
print(i, j)
它运行得非常好;输出结果为
1 0
2 0
2 1
3 0
3 1
3 2
4 0
4 1
4 2
4 3
我不想为每个额外的索引增加一个缩进级别,因此我更喜欢这个版本:
for i, j in ((i, j) for i in range(N) for j in range(i)):
print(i, j)
这个工作得非常好,做了它应该做的事情,并且消除了多余的缩进级别。
我希望能够拥有更加优雅的解决方案(对于两个指数来说不是很相关,但对于三个或更多个指数来说就变得更加重要)。到目前为止,我想出了这个:
from itertools import combinations
for j, i in combinations(range(N), 2):
print(i, j)
这可以很好地遍历相同的索引对。唯一不同的是出现的索引对的顺序:
1 0
2 0
3 0
4 0
2 1
3 1
4 1
3 2
4 2
4 3
由于我正在处理这些索引的顺序很重要,因此我无法使用这个。是否有一种简洁、短小、Pythonic的方法,可以按照第一个示例产生的相同顺序迭代这些索引?请记住,N将会很大,所以排序不是我想要做的事情。
yield from
(从Python 3.3开始支持)可以使代码更加简洁,例如yield from range(N)
。 - lazzzis