展平一个非常嵌套的循环[重复]
发布于 2021-01-29 16:39:57
这个问题已经在这里有了答案 :
避免嵌套for循环 (2个答案)
6年前关闭。
如果我有一组这样的循环:
x = [[...],[...],[...]]
for a in x[0]:
for b in x[1]:
for c in x[2]:
# Do something with a,b,c
有没有一种简单的方法可以简化它,尤其是在有更多层次的情况下?这似乎很容易做到,但我无法弄清楚。
关注者
0
被浏览
46
1 个回答
-
使用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