24

我经常发现自己这样做:

for x in range(x_size):
    for y in range(y_size):
        for z in range(z_size):
            pass # do something here

在 Python 中有没有更简洁的方法来做到这一点?我正在考虑类似的事情

for x, z, y in ... ? :
4

4 回答 4

40

您可以使用itertools.product

>>> for x,y,z in itertools.product(range(2), range(2), range(3)):
...     print x,y,z
... 
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
于 2012-12-14T19:44:17.767 回答
8

如果您已经numpy成为依赖项,numpy.ndindex那么可以解决问题...

>>> for x,y,z in np.ndindex(2,2,2):
...     print x,y,z
... 
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
于 2012-12-14T19:42:40.800 回答
7

使用itertools.product()

import itertools
for x, y, z in itertools.product(range(x_size), range(y_size), range(z_size)):
    pass # do something here

从文档:

输入迭代的笛卡尔积。

等效于生成器表达式中的嵌套 for 循环。
...

于 2012-12-14T19:44:33.307 回答
0

这取决于循环内部的内容。如果处理列表,您可以使用列表推导

对于更一般的情况,请参阅itertools 上的这篇文章

于 2012-12-14T19:44:46.193 回答