2015-04-05 28 views
2

使用Python工作,但尋找一般結構。從for循環的下一級抽象?

我有一個函數,需要輸入一個長度爲L的數組(例如,[0,0,0,...,0]與L半正元素)。輸入數組的每個元素都有一個正的最大值,例如,我有一個長度爲L的數組max_vals = [10,5,4,...,7]。我想遍歷所有可能的函數輸入。

這可以使用「泛化計數」很容易地完成,但我不知道是否有更優雅的方式來做到這一點。具體而言,我想像一些結構:

meta_for vector in meta_range(max_vals): 
    relevant_function(vector) 

即功能上等同於:

for i_1 in range(max_vals[0]): 
    for i_2 in range(max_vals[1]): 
     ... 
      for i_L in range(max_vals[L-1]): 
       relevant_function([i_1, i_2, ..., i_L]) 

的困難在於,嵌套for循環的數量取決於L,並因此不能硬編碼。

這樣的事情是否存在?

+0

這聽起來像你正在尋找計算[發電機組](http://en.wikipedia.org/維基/ Power_set)。 – 2015-04-05 19:49:58

+0

是的。簡單的方法是遞歸。 – 2015-04-05 19:50:02

+0

你能舉一個輸入和期望輸出的例子嗎? – brunodea 2015-04-05 19:50:53

回答

3

你可以用itertools.product做到這一點:

import itertools 
max_vals = [3, 2] 
for I in itertools.product(*[range(m) for m in max_vals]): 
    print I 

打印

(0, 0) 
(0, 1) 
(1, 0) 
(1, 1) 
(2, 0) 
(2, 1) 
+0

謝謝!這正是我所期待的。我真的需要坐在itertools文檔中;它真的好像該模塊應該被引入到基本語言中。 – dhack 2015-04-05 20:06:03