Избегание вложенных циклов - программирование
Подтвердить что ты не робот

Избегание вложенных циклов

Я пытаюсь выполнить некоторое тестирование параметров на другом коде с помощью python. Мне нужно проверить 6 независимых параметров, но мне нужны все возможные комбинации из них.

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

for var1 in xrange(min1,max1,step1):
    for var2 in xrange(min2,max2,step2):
        ...
            ...
                ...
                    for var6 in xrange(min6,max6,step6):
                        '''
                        Do something and be icky in the process due
                        to being in the middle of six nested for loops
                        '''

Я решил, нет! Это не выдерживает. Поэтому я пытался разработать способ сделать это рекурсивно или, по крайней мере, не вложенным шесть раз. Я не могу придумать хорошую схему для этого. Самое большое препятствие для меня состоит в том, что каждая переменная имеет другое значение min, max и step.

Мои мысли пока не очень полезны. Я продолжаю пытаться сделать какую-то рекурсивную функцию, но я просто не могу понять ее, не вложив больше циклов в функцию. Я видел здесь много ссылок на itertools.product, но я не могу понять, как это сделать.

Изменить: то, что я делаю, это создать каталог с именем после комбинации параметров, записать файл с этими параметрами, запустить другой код с этим файлом и проанализировать вывод из этого кода. Я не делаю ничего в буквальном смысле ни одного из циклов, за исключением последнего. Многие параметры имеют только 2 значения, у некоторых - 10, другие - 3... это просто меняется.

4b9b3361

Ответ 1

Здесь, как использовать product:

x1 = xrange(min1,max1,step1)
x2 = xrange(min2,max2,step2)
x3 = xrange(min3,max3,step3)
...

for v1, v2, v3, v4, v5, v6 in itertools.product(x1, x2, x3, x4, x5, x6):
    icky_thing(....)

или немного компактнее:

ranges = [
    xrange(min1,max1,step1),
    xrange(min2,max2,step2),
    xrange(min3,max3,step3),
    ...
]

for v1, v2, v3, v4, v5, v6 in itertools.product(*ranges):
    icky_thing(....)

Ответ 2

Вы можете использовать itertools.product: http://docs.python.org/library/itertools.html#itertools.product.

Что-то вроде

for var1, var2 in itertools.product(xrange(min1, max1, step1), xrange(min2, max2, step2)):
    # stuff

., только там, где есть все шесть варов.