2015-04-12 63 views
1

注意:更正的問題!局部巢for循環

衆所周知,itertools允許使用itertools.product輕鬆創建嵌套for 環路。但以下是我想要的,而且還不能做到。使用

lfl = int(input("length of first loop: ")) 
nol = int(input("number of loops: ")) 

曹景偉:循環

  • 長度:12
  • 環路數:4

我想一個等同於:

for i1 in range(1,12): 
    for i2 in range(i1,12): 
     for i3 in range(i2,12): 
      for i4 in range(i3,12): 
       function(i1,i2,i3,i4) 

itertools.product做去許多方法。

或者nol導致創建func_1(x),func_2(x,y),... func_nol-1(x,y,...)和代碼需要等效的更一般的問題於:

for i1 in range(1,12): 
    for i2 in range(func_1(i1),12): 
     for i3 in range(func_2(i1,i2),12): 
      for i4 in range(func_3(i1,i2,i3),12): 
       function(i1,i2,i3,i4) 

還有一進一步的歸納,那

for i1 in range(1,12): 
    for i2 in range(start_func_1(i1, *global),end_func_(12, *global)): 
     for i3 in range(start_func_2(i1,i2,*global),end_func_2(12,*global): 
      for i4 in range(start_func_3 etc.... 
+0

你的*產品確實意味着什麼方式很多。*? – Kasramvd

+0

@timothy您是如何使用'product'的? – matsjoyce

+0

@Kasra我錯誤的內循環範圍,我編輯了這個問題。 –

回答

0

你可以做到這一點使用product - 你只需要在初始準備步驟來創建環路的「尺寸」:

from itertools import product 

length = 12 
loops = 4 

ranges = [range(x+1,length) for x in range(loops)] 

def f(x): # accepts a tuple, since the number of arguments may vary 
    print("f(%s)" % repr(x)) 

for t in product(*ranges): 
    f(t) 
0

這是完全等同於你所提供的代碼:

from itertools import product 

lfl = 12 
nol = 4 

ranges = (range(i, lfl) for i in range(1, nol + 1)) 
args = product(*ranges) 

for arg in args: 
    function(*arg) 

它採用了generator expression建立用於循環的範圍的列表傳遞給itertools.productargument list unpacking傳遞的參數一個元組爲將函數的單獨參數分配給product()

示範:

from itertools import product 

def function(*args): 
    return args 

results_nested = [] 
results_product = [] 

for i1 in range(1, 12): 
    for i2 in range(2, 12): 
     for i3 in range(3, 12): 
      for i4 in range(4, 12): 
       results_nested.append(function(i1, i2, i3, i4)) 

lfl = 12 
nol = 4 

ranges = (range(i, lfl) for i in range(1, nol + 1)) 
args = product(*ranges) 

for arg in args: 
    results_product.append(function(*arg)) 


assert results_nested == results_product 
+0

我很抱歉,但我在我的問題中有一個錯誤。實際上是拼寫錯誤。我很欣賞這些答案,特別是發現我不知道的*參數。我將以答覆的形式重提問題。 –

+0

@timothysorenson沒有問題,它發生;-)感謝您讓我知道和更新問題。 –

1

爲了您糾正問題,嘗試combinations_with_replacement而不是product您範圍的名單上:

from itertools import combinations_with_replacement 

nums = [10, 11, 12, 13] 
for c in combinations_with_replacement(nums, 3): 
    print c 

打印

(10, 10, 10) 
(10, 10, 11) 
(10, 10, 12) 
(10, 10, 13) 
(10, 11, 11) 
(10, 11, 12) 
(10, 11, 13) 
(10, 12, 12) 
... 
+0

不幸的是,'tool'返回'(n + r-1)!/r! /(n-1)!'不同的元組。因此,在我修正的例子中,這將大大超調。如果它具有正確的條件,即(i4> = i3> = i2> = i1),那麼真的會喜歡無需測試就能滿足條件的元組。 –

+0

嗯,我不明白這是什麼缺點。你想'i1≤i2≤i3≤i4',對嗎?如果你傳遞它,比如說'range(1,12)'和'4',這段代碼就會生成正確的序列。 – Lynn

+0

您的評論因我在第一個示例中給出的標準而死亡,我的思想已經轉移到一般問題。但你的答案很美,而且是正確的。不幸的是,i4> i3> i2> 1的小變化會立即引發問題。 SO combination_with_replacement完全等同於我的第一個問題。但是,我應該立即問我的一般問題,因爲這是我真正感興趣的!我必須記得非常準確! –