2010-11-11 10 views
6

Per i miei clienti, l'iterazione attraverso più contatori si sta trasformando in un'attività ricorrente.Python: contatori nidificati

Il modo più semplice sarebbe qualcosa di simile a questo:

cntr1 = range(0,2) 
cntr2 = range(0,5) 
cntr3 = range(0,7) 

for li in cntr1: 
    for lj in cntr2: 
     for lk in cntr3: 
      print li, lj, lk 

Il numero di contatori può essere ovunque da 3 a e quelli annidati per i loop iniziare a prendere fino immobiliare.

Esiste un modo Python per fare qualcosa di simile?

for li, lj, lk in mysteryfunc(cntr1, cntr2, cntr3): 
    print li, lj, lk 

continuo a pensare che qualcosa nel itertools si adatterebbe questo disegno di legge, ma non sono abbastanza con itertools familiare per dare un senso delle opzioni. Esiste già una soluzione come itertools o devo eseguire il rollover?

Grazie, j

risposta

7

Quello che vuoi è itertools.product

for li, lj, lk in itertools.product(cntr1, cntr2, cntr3): 
    print li, lj, lk 

farà esattamente quello che si richiede. Il nome deriva dal concetto di prodotto cartesiano.

+0

Eccellente. Grazie, Winston. –

+0

Inoltre (nel caso in cui qualcuno con un problema leggermente diverso arriva qui): Supponiamo di avere un array 'cntr = [cntr1, cntr2, cntr3]'. Quindi chiamare 'itertools.product (cntr)' non funzionerà. (Stampa solo tutte le 1-tuple in cui il primo elemento è un elemento di 'cntr'; in pratica stampa' cntr'.) Invece, puoi fare itertools.product (* cntr) '. – ShreevatsaR

Problemi correlati