2011-03-16 88 views
0

我想重複計算給定公式的所有可能性。我需要寫下嵌套迭代,但無法做到正確。我不擅長算法:(n值迭代

爲了計算所有的可能性(%0〜100%)3恆{Z1,Z2,Z3}值,我準備:

a=frange(0,1.0,0.01) 
for z1 in a: 
    for z2 in a: 
    for z3 in a: 
     calculate(z1,z2,z3) 

和正常工作,因爲我預計。

如果Z是由n個值(n可以是2-30在我的情況)的列表,你建議我哪一個算法來處理呢?我怎樣才能創建嵌套迭代?

+1

就像那樣。或者這是個詭計問題? – 2011-03-16 11:34:13

+0

@Ignacio:我敢打賭,當我們看到它時,我們會像「Doh!」一樣。 – 2011-03-16 11:36:21

+0

事實上,如果這個工作正常,你還需要什麼!? – tiagoboldt 2011-03-16 11:36:28

回答

6

最簡單的方法是使用itertools.product()

a=frange(0,1.0,0.01) 
for z in itertools.product(a, repeat=n): 
    calculate(*z) 

如果n真的會30,這將遍歷100**30 = 10**60值。準備等待。

+0

我什至不知道這樣的模塊存在:)非常感謝,python是偉大的。 – Fish 2011-03-16 11:41:16

+0

Sven,把*置於z前面的任何含義計算(* z)?計算並不是什麼大問題,謝謝。 – Fish 2011-03-16 11:57:56

+0

@FISH:如果你知道'n'是'3',你可以在'itertools.product(...)'中寫入'z1,z2,z3'。由於您事先不知道'n',因此不能使用序列解包,'z'是所有參數的元組。我假設'calculate()'帶有'n'參數,並且在調用'calculate()'時解開元組。 – 2011-03-16 12:05:14

0

itertools.product會做你想做的事(和更多)。不幸的是,它希望它的產品它計算在不同的參數列表,像這樣:

>>> list(itertools.product([1,2,3],[1,2,3])) 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] 

等等它,你需要做這樣的事情的臉:

a=frange(0,1.0,0.01) 
for (z1,z2,z3) in itertools.product(a,a,a): calculate(z1,z2,z3) 

,但如果你想使用對於不同數量的產品的確切的代碼,你可以說

a=frange(0,1.0,0.01) 
for (z1,z2,z3) in itertools.product(*(3*[a])): calculate(z1,z2,z3) 

a=frange(0,1.0,0.01) 
for (z1,z2,z3) in apply(itertools.product, 3*[a]): calculate(z1,z2,z3) 
+0

(Sven M.在我寫我的時候發表了他的回答,他更好,因爲他知道'itertools.product'的''repeat' kwarg',我沒有,我將把它留在這裏,而不是僅僅刪除它如果額外冗長對任何人都有幫助。) – 2011-03-16 11:42:12