Избегание вложенных циклов
Я пытаюсь выполнить некоторое тестирование параметров на другом коде с помощью 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... это просто меняется.
Ответы
Ответ 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
., только там, где есть все шесть варов.