2012-06-24 242 views
17

我想在另一個使用python的代碼上做一些參數測試。我需要測試6個獨立的參數,但我需要所有可能的組合。避免嵌套循環

每個參數都有最小值,最大值和需要傳遞給它的步長值。第一個簡單的解決方案,它出現在我的頭是一個嵌套循環結構,看起來可怕的,就像這樣:

for var1 in xrange(min1,max1,step1): 
    for var2 in xrange(min2,max2,step2): 
     ... 
      ... 
       ... 
        for var6 in xrange(min6,max6,step6): 
         ''' 
         Do something and be icky in the process due 
         to being in the middle of six nested for loops 
         ''' 

我決定,不!這不應該成立。所以我一直在試圖找出一種方法來遞歸地執行這個操作,或者至少不是嵌套6次。我不能真的想出一個好的計劃來這樣做。對我來說最大的障礙是每個變量都有不同的最小值,最大值和步長值。

我的想法到目前爲止沒有什麼幫助。我一直試圖讓一些遞歸函數起作用,但是我不能在函數中嵌套更多的循環。我已經在這裏看到了很多關於itertools.product的參考,但是我不太清楚如何做這件事。

編輯:我在做的是創建一個以參數組合命名的目錄,用這些參數編寫一個文件,用這個文件運行另一個代碼,並分析該代碼的輸出。除了最後一個循環以外,我沒有在任何for循環中做任何事情。許多參數只有2個值,一些有10個,其​​他有3個......它只是有所不同。

+2

又該所有環路內實際做了什麼?我認爲這是最重要的問題 - 有一些語法糖來隱藏循環(但仍然執行它們),但爲了避免嵌套循環,最重要的是要理解原始問題 – Aprillion

+1

@deathApril是對的:我已經給你一種避免下面循環的方法,但你仍然需要做所有這些迭代。更好的辦法是使用不同的算法來避免迭代。 –

+0

添加了一個編輯來解釋爲什麼我需要這個 – rapidsnow

回答

34

下面介紹如何使用product

x1 = xrange(min1,max1,step1) 
x2 = xrange(min2,max2,step2) 
x3 = xrange(min3,max3,step3) 
... 

for v1, v2, v3, v4, v5, v6 in itertools.product(x1, x2, x3, x4, x5, x6): 
    icky_thing(....) 

或略偏緊湊:

ranges = [ 
    xrange(min1,max1,step1), 
    xrange(min2,max2,step2), 
    xrange(min3,max3,step3), 
    ... 
] 

for v1, v2, v3, v4, v5, v6 in itertools.product(*ranges): 
    icky_thing(....) 
+0

美麗的代碼<3 – gabeio

+0

不錯!即將問一個關於如何做到這一點的問題! – madbitloman