2012-06-24 17 views
17

Sto provando a eseguire alcuni test dei parametri su un altro codice usando python. Ho bisogno di testare 6 parametri indipendenti, ma ho bisogno di tutte le possibili combinazioni di essi.Evitare loop nidificati

Ogni parametro ha un valore minimo, un valore massimo e un valore di passaggio che devono essere passati ad esso. La prima soluzione facile che mi è venuta in mente è stata una nidificato per la struttura ad anello che sembrava orribile, come questo:

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

ho deciso, no! Questo non deve sopportare. Quindi ho cercato di trovare un modo per farlo in modo ricorsivo o, per lo meno, non annidato sei volte. Non riesco davvero a trovare un buon piano per farlo. Il più grande ostacolo per me è che ogni variabile ha un valore min, max e step diverso.

I miei pensieri finora non sono molto utili. Continuo a provare a far funzionare alcune funzioni ricorsive, ma non riesco a capirlo senza annidare di più i loop all'interno della funzione. Ho visto molti riferimenti a itertools.product qui, ma non riesco proprio a capire come farlo funzionare.

Modifica: Quello che sto facendo è creare una directory chiamata dopo la combinazione dei parametri, scrivere un file con quei parametri, eseguire un altro codice con questo file e analizzare l'output da quel codice. Non sto facendo nulla in alcuno dei loop for tranne che per quello finale. Molti parametri hanno solo 2 valori, altri 10, altri 3 ... è solo un po 'diverso.

+2

quello che dovrebbe essere effettivamente fatto all'interno di tutti quei cicli? Penso che sia la domanda più importante - ci sono alcuni zuccheri di sintassi per nascondere i loop (ma li eseguono comunque), ma per evitare loop annidati, la cosa più importante è capire il problema originale – Aprillion

+1

@deathApril ha ragione: I've ti ha dato un modo per evitare i loop sottostanti, ma devi comunque fare tutte quelle iterazioni. Sarebbe meglio usare un algoritmo diverso per evitare le iterazioni. –

+0

Aggiunta una modifica per spiegare perché ho bisogno di questo – rapidsnow

risposta

34

Ecco come utilizzare 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(....) 

o un po 'più compatto:

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

codice bello <3 – gabeio

+0

Bello! Stava per fare una domanda su come fare questo! – madbitloman

Problemi correlati