2012-06-24 30 views
17

Próbuję wykonać niektóre testy parametrów na innym kodzie przy użyciu Pythona. Muszę przetestować 6 niezależnych parametrów, ale potrzebuję ich wszystkich możliwych kombinacji.Unikanie zagnieżdżonych dla pętli

Każdy parametr ma wartość minimalną, maksymalną i krokową, która musi zostać przekazana do niego. Pierwszym prostym rozwiązaniem, które wpadło mi do głowy, była zagnieżdżona struktura pętli, która wyglądała przerażająco:

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 
         ''' 

Postanowiłem, że nie! To nie wytrzyma. Tak więc próbowałem znaleźć sposób, aby zrobić to rekursywnie, lub przynajmniej nie zagnieżdżone sześć razy. Nie mogę wymyślić dobrego planu, aby to zrobić. Największą przeszkodą dla mnie jest to, że każda zmienna ma inną wartość min, max i step.

Moje dotychczasowe przemyślenia nie są zbyt pomocne. Staram się, aby funkcja rekursywna działała, ale po prostu nie mogę tego rozgryźć bez zagnieżdżenia więcej pętli w funkcji. Widziałem wiele odniesień do itertools.product tutaj, ale nie mogę również dowiedzieć się, jak to zrobić.

Edycja: Co robię, to tworzenie katalogu nazwanego po połączeniu parametrów, zapisanie pliku z tymi parametrami, uruchomienie innego kodu z tym plikiem i analiza danych wyjściowych z tego kodu. Nic nie robię w dosłownie żadnej pętli for, z wyjątkiem ostatniej. Wiele parametrów ma tylko 2 wartości, niektóre 10, inne 3 ... to tylko zmienia się.

+2

co powinno być właściwie wykonane wewnątrz tych wszystkich pętli? Myślę, że to najważniejsze pytanie - jest kilka cukrów składniowych, które chowają pętle (ale nadal je wykonują), ale aby uniknąć zagnieżdżonych pętli, najważniejszą rzeczą jest zrozumienie pierwotnego problemu. – Aprillion

+1

@deathApril ma rację: mam da ci sposób na uniknięcie pętli poniżej, ale nadal musisz wykonać wszystkie te iteracje. Lepiej byłoby użyć innego algorytmu, aby uniknąć iteracji. –

+0

Dodano edycję wyjaśniającą, dlaczego potrzebuję tego – rapidsnow

Odpowiedz

34

Oto jak korzystać 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(....) 

lub trochę bardziej zwięźle:

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

piękny kod <3 – gabeio

+0

Nice! Już miał zadać pytanie, jak to zrobić! – madbitloman

Powiązane problemy