我有以下代碼:
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,它沒有任何區別。
uj5u.com熱心網友回復:
代碼未按預期運行的原因與它不起作用的原因相同:
p = iter(range(6))
p2 = iter(range(6))
for pos in p:
for shift in p2:
print(pos,shift)
itertools.product回傳一個只能使用一次的迭代器。第一次回圈時,p2您已經消耗了所有值,并且外部回圈的后續迭代基本上變成了無操作。
您需要將迭代器輸出存盤到可以迭代多次的容器中,或者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)
注意:實際上,permutationsandproduct方法實際上是用于生成操作特定類的建構式呼叫,但是,它們確實實作了迭代器介面,所以我只是這么稱呼它們!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/451579.html
