两个涉及 itertools 的嵌套 for 循环不产生外循环的排列

Two nested for loops involving itertools don't produce the permutations of the outer loop

我有以下代码:

a = [0,1,2,3,4]
b = range(6)
p = itertools.permutations(a)
p2 = itertools.product(b,b,b,b,b)

for pos in p:
    for shift in p2:
        print(pos,shift)

打印出:

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

外循环只执行一次。如果我这样做

for pos in p:
    print(pos)

循环执行得很好:

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

为什么会这样,如何使两个嵌套的 for 循环起作用?请注意,我已经尝试循环 list(p) 而不是 p 并且它没有什么区别。

代码未按预期运行的原因与此代码不起作用的原因相同:

p = iter(range(6))
p2 = iter(range(6))

for pos in p:
    for shift in p2:
        print(pos,shift)

itertools.product returns 一个只能消耗一次的迭代器。第一次循环 p2 时,您已经消耗了所有值,外循环的后续迭代基本上变成了 no-op.

您需要将迭代器输出存储到一个可以多次迭代的容器中,或者多次调用 itertools.product 以根据需要进行重构。

import itertools

a = [0,1,2,3,4]
b = range(6)
p = itertools.permutations(a)
p2 = list(itertools.product(b,b,b,b,b))

for pos in p:
    for shift in p2:
        print(pos,shift)

import itertools

a = [0,1,2,3,4]
b = range(6)
p = itertools.permutations(a)

for pos in p:
    p2 = itertools.product(b,b,b,b,b)
    for shift in p2:
        print(pos,shift)

注意:实际上,permutationsproduct方法实际上是构造函数调用以生成特定操作类,但是,它们确实实现了迭代器接口所以我只是这样称呼他们!