2016-06-28 105 views
-1

我明白,要創建動態for循環,python中的遞歸或itertools模塊是要走的路。可以說我正在遞歸的。動態Python中的循環

我要的是

for var1 in range(var1_lowerlimit, var1_upperlimit, var1_stepsize): 
    for var2 in range(var2_lowerlimit, var2_upperlimit, var2_stepsize): 
    : 
    : 
     # do_whatever() 

重複了N個迴路,其中n爲變量

我現在是多少我有2所列出

variable_list = [ var1, var2, var3, ... ] 
boundaries_list = [ [var1_lowerlimit, var1_upperlimit, var1_stepsize], 
        [var2_lowerlimit, var2_upperlimit, var2_stepsize], ...] 

def dynamic_for_loop(variable_list , boundaries_list, no_of_loops, list_index = 0): 
    if no_of_loops <= 0: 
     # do_whatever() 
    else: 
     lower_bound = boundaries_list[list_index][0] 
     upper_bound = boundaries_list[list_index][1] 
     step_size = boundaries_list[list_index][2] 
     for index in range(lower_bound, upper_bound, step_size): 
      list_index += 1 
      try: 
       dynamic_for_loop(variable_list , boundaries_list, no_of_loops - 1, list_index) 
      except: 
       list_index = 0 
       dynamic_for_loop(variable_list , boundaries_list, no_of_loops - 1, list_index) 

我做了復位在list_index上,因爲它超出範圍,但我無法得到我想要的結果。有人能夠啓發我出了什麼問題嗎?

+1

這顯然是過度工程。你究竟想達到什麼目的? – DeepSpace

+1

並且不要試圖將其解壓到單獨的變量中。如果你的循環計數是可變的,那麼只需處理元組'product()'就可以動態生成。 –

+0

它的一個組合研究通過改變一些變量,每個變量都有自己的邊界來觀察,這就是爲什麼我把變量和邊界變成一個列表來訪問它使用list_index – Max

回答

2

使用itertools.product()功能在範圍內的變量數生成的值:

for values in product(*(range(*b) for b in boundaries_list)): 
    # do things with the values tuple, do_whatever(*values) perhaps 

不要嘗試設置可變數量的變量;只需遍歷values元組或根據需要使用索引。

在調用中使用*告訴Python獲取迭代的所有元素並將它們作爲單獨的參數應用。因此,您的boundaries_list中的每個b作爲單獨的參數應用於range(),就像您調用range(b[0], b[1], b[2])一樣。

這同樣適用於product()調用;生成器表達式生成的每個range()對象作爲單獨的參數傳遞給product()。通過這種方式,您可以將動態號碼range()傳遞給該呼叫。

+0

我相信你需要解開你傳遞給產品的發電機,也就是啪啪! –

+0

@ juanpa.arrivillaga:啊,是的,當然。 –

+0

謝謝!我對Python非常陌生,所以我仍然在消化你剛寫的一行代碼 – Max

0

只是爲了好玩,我以爲我會實現這個使用遞歸來展示pythonic風格。當然,如Martijn Pieters所證明的那樣,pythonic的方式將使用itertools包。

def dynamic_for_loop(boundaries, *vargs): 
    if not boundaries: 
     print(*vargs) # or whatever you want to do with the values 
    else: 
     bounds = boundaries[0] 
     for i in range(*bounds): 
      dynamic_for_loop(boundaries[1:], *(vargs + (i,))) 

現在我們可以使用它像這樣:

In [2]: boundaries = [[0,5,1], [0,3,1], [0,3,1]] 

In [3]: dynamic_for_loop(boundaries) 
0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 1 2 
0 2 0 
0 2 1 
0 2 2 
1 0 0 
1 0 1 
1 0 2 
1 1 0 
1 1 1 
1 1 2 
1 2 0 
1 2 1 
1 2 2 
2 0 0 
2 0 1 
2 0 2 
2 1 0 
2 1 1 
2 1 2 
2 2 0 
2 2 1 
2 2 2 
3 0 0 
3 0 1 
3 0 2 
3 1 0 
3 1 1 
3 1 2 
3 2 0 
3 2 1 
3 2 2 
4 0 0 
4 0 1 
4 0 2 
4 1 0 
4 1 1 
4 1 2 
4 2 0 
4 2 1 
4 2 2