4 Stimmen

Das Abflachen einer stark verschachtelten Schleife

Wenn ich eine Schleifenanordnung wie diese habe:

x = [[...],[...],[...]]    

for a in x[0]:
  for b in x[1]:
    for c in x[2]:
      # Do something with a,b,c

Gibt es einen einfachen Weg, dies zu vereinfachen, insbesondere wenn es mehr Ebenen gibt? Es scheint relativ einfach zu sein, aber ich kann einfach nicht darauf kommen.

7voto

Wolph Punkte 73880

Es ist ziemlich einfach mit der itertools Bibliothek.

for x, y, z in itertools.product(a, b, c):
    print x, y, z

So könnte itertools.product implementiert werden:

def product(*args, **kwds):
    # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
    # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
    pools = map(tuple, args) * kwds.get('repeat', 1)
    result = [[]]
    for pool in pools:
        result = [x+[y] for x in result for y in pool]
    for prod in result:
        yield tuple(prod)

Beispiel:

In [1]: a = range(2)    
In [2]: b = range(2, 4)
In [3]: c = range(4, 6)
In [4]: import itertools
In [5]: list(itertools.product(a, b, c))
Out[5]: 
[(0, 2, 4),
 (0, 2, 5),
 (0, 3, 4),
 (0, 3, 5),
 (1, 2, 4),
 (1, 2, 5),
 (1, 3, 4),
 (1, 3, 5)]

In [6]: for x, y, z in itertools.product(a, b, c):
   ...:     print 'x: %d, y: %d, z: %d' % (x, y, z)
   ...: 
x: 0, y: 2, z: 4
x: 0, y: 2, z: 5
x: 0, y: 3, z: 4
x: 0, y: 3, z: 5
x: 1, y: 2, z: 4
x: 1, y: 2, z: 5
x: 1, y: 3, z: 4
x: 1, y: 3, z: 5

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X