2010-11-11 14 views
6

Für meine Kunden wird die Iteration durch mehrere Zähler zu einer wiederkehrenden Aufgabe.Python: Nesting Counters

Der einfachste Weg wäre so etwas wie dieses:

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 

Die Anzahl der Zähler kann für Schleifen verschachtelt überall von 3 auf und diejenigen, beginnen Immobilien einnehmen.

Gibt es eine pythonische Art, so etwas zu tun?

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

Ich denke immer, dass etwas in itertools diese Rechnung passen würde, aber ich bin einfach nicht vertraut genug mit itertools Sinne der Optionen zu machen. Gibt es bereits eine Lösung wie itertools, oder muss ich meine eigene rollen?

Danke, j

Antwort

7

Was Sie wollen, ist itertools.product

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

genau das tun, was Sie fordern. Der Name leitet sich vom Konzept eines kartesischen Produkts ab.

+0

Ausgezeichnet. Danke, Winston. –

+0

Weiter (falls jemand mit einem etwas anderen Problem hier ankommt): Angenommen, Sie haben ein Array 'cntr = [cntr1, cntr2, cntr3]'. Dann wird der Aufruf von 'itertools.product (cntr)' nicht funktionieren. (Es druckt nur alle 1-Tupel, wobei das erste Element ein Element von 'cntr' ist; effektiv wird'cntr' gedruckt.) Stattdessen können Sie' itertools.product (* cntr) 'tun. – ShreevatsaR