如何使用itertools.product做依赖嵌套循环?

How to do dependent nested loop using itertools.product?

for i in range(n):
    for j in range(i + 1, n):

如何使用 itertools.product 执行此操作?它需要可变数量的可迭代对象,但似乎没有办法从另一个可迭代对象中引用一个可迭代对象。

例如,n=5:

for x in itertools.product(range(5), range(1, 5))

生成

(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 1)
...

注意 (1, 1) 不应该存在。

对于给定的 n

n = 5

for i in range(n):
    for j in range(i + 1, n):
        print((i, j))

打印:

(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 2)
(1, 3)
(1, 4)
(2, 3)
(2, 4)
(3, 4)

这不是笛卡尔积,itertools.product 是笛卡尔积。它是一个组合,可以用 itertools.combinations:

from itertools import combinations, product

tups = list(combinations(range(5), r=2))

tups 将是:

[(0, 1),
 (0, 2),
 (0, 3),
 (0, 4),
 (1, 2),
 (1, 3),
 (1, 4),
 (2, 3),
 (2, 4),
 (3, 4)]

你可以itertools.combinations(range(5),2)range(5) 告诉它元素的范围从 0 到 4,而 2 告诉它每个元组有 2 个元素。如果你想访问每个元组中的元素,你可以做索引:

for x in itertools.combinations(range(5),2):
    i = x[0]
    j = x[1]

或者您可以在 for 循环中列出变量名称:

for i, j in itertools.combinations(range(5),2):