Идиома вложенного цикла Python

Я часто делаю это:

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 ... ? :

Ответ 1

Вы можете использовать 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

Ответ 2

Если у вас уже есть 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

Ответ 3

Используйте itertools.product():

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

Из документов:

Декартово произведение входных итераций.

Эквивалентен вложенным циклам в выражении генератора.
...

Ответ 4

Это зависит от того, что находится внутри цикла. Если вы имеете дело со списками, вы можете использовать понимание списка

Для более общего случая см. Этот пост на itertools.