Параметрические вложенные циклы в Python - PullRequest
0 голосов
/ 16 октября 2018

Один параметр в моей модели контролирует размерность массивов;оно может варьироваться от 1 до любого положительного целого числа: для моих целей это может быть до 20.
Поток программы проходит через несколько циклов, которые зависят от этого измерения.

Например, еслизначение параметра у меня будет такое:

for i1 in range(0,100,1):
   do stuff

Если значение параметра два, то у меня будет что-то вроде:

for i1 in range (0,100,1):
    for i2 in range (0,100,1):
        do stuff 

Или, если значениеиз трех параметров у меня будет:

for i1 in range (0,100,1):
    for i2 in range (0,100,1):
        for i3 in range (0,100,1):
            do stuff

Размер может измениться, поэтому невозможно заранее указать, сколько вложенных циклов потребуется;это должно быть написано некоторым параметрическим способом.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Поскольку вы не указали обработку в промежуточных циклах - только в самом внутреннем цикле, я чувствую, что вам действительно нужен итератор для вашей последовательности индексов:

Пусть max_dim будетразмерность вашего пространства, количество измерений.

max_val = 100
one_dim = list(range(max_val))
all_dim = [one_dim] * max_val

all_dim теперь список списков, по одному для каждого измерения.Каждый список содержит значения 0-99, те самые значения, которые используются вашими вложенными циклами.Теперь о магических шагах от itertools:

from itertools import product
for index_list in product(*all_dim):
    # do your stuff; the index_list is [i1, i2, i3, ...]

Это будет перебирать все желаемые измерения.Для небольшого примера, вот как выглядит последовательность product только с двумя значениями и тремя измерениями:

>>> all_dim = [[0,1]] * 3
>>> all_dim
[[0, 1], [0, 1], [0, 1]]
>>> list(product(*all_dim))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

Это достаточно хорошо справляется с вашей проблемой?

0 голосов
/ 16 октября 2018

Использовать рекурсию для вложенных циклов переменной глубины.

def nested(parameters, depth):
    for x in range(0,100,1):
        if depth==0:
            do
        else:
            nested(parameters, depth-1)
...