两个涉及 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)
注意:实际上,permutations
和product
方法实际上是构造函数调用以生成特定操作类,但是,它们确实实现了迭代器接口所以我只是这样称呼他们!
我有以下代码:
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)
注意:实际上,permutations
和product
方法实际上是构造函数调用以生成特定操作类,但是,它们确实实现了迭代器接口所以我只是这样称呼他们!