2013-08-21 27 views
3

如果我有这样一组循环:平展非常嵌套循环

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

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

有没有一种简单的方法来简化它,尤其是如果有更多的水平呢?这似乎很容易做到,但我无法弄清楚。

回答

6

itertools库很容易。

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

如何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) 

例子:

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 
+2

我认为你的意思'itertools.product(* X)'。 – user2357112

+0

难道不是更像'itertools.product(* x)'?,或者'itertools.product(x [0],x [1],x [2])'吗? – SethMMorton

+0

谢谢,这是有效的,从上述评论的变化。我也注意到,如果你使用'in in',它会把所有东西都交给一个元组! – JJJollyjim