Aplanando un bucle muy nested

Si tengo un conjunto de bucles como este:

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

¿Existe una forma sencilla de simplificarlo, especialmente si hay más niveles? Parece algo muy fácil de hacer, pero no puedo entenderlo.

Es bastante fácil con la biblioteca de itertools.

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

Cómo se puede implementar itertools.product :

 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) 

Ejemplo:

 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