2011-03-16 3 views
0

Я хотел бы сделать итерацию для вычисления всех возможностей данной формулы. Мне нужно записать вложенную итерацию, но не удалось сделать это правильно. Я не очень хорошо алгоритм :(Итерация над n значениями

Для расчета всех возможностей (% 0-% 100) 3 константы {z1, z2, z3} значения, я подготовил:

a=frange(0,1.0,0.01) 
for z1 in a: 
    for z2 in a: 
    for z3 in a: 
     calculate(z1,z2,z3) 

и работает должным образом, как I ожидается.

Если г список, состоящий из значений п (п может быть 2-30 в моем случае), Какой алгоритм вы предлагаете мне справиться с этим? Как я могу создать вложенную итерацию?

+1

Нравится это. Или это спорный вопрос? –

+0

@ Игнасио: Готов поспорить, когда мы увидим это, мы все будем похожи на «Doh!». –

+0

действительно, если это работает правильно, что еще вам нужно !? – tiagoboldt

ответ

6

Самый простой способ - использовать itertools.product():

a=frange(0,1.0,0.01) 
for z in itertools.product(a, repeat=n): 
    calculate(*z) 

Если n действительно будет 30, это будет перебирать 100**30 = 10**60 значения. Будьте готовы ждать.

+0

Я даже не знал, что такой модуль существует :) Большое спасибо, python замечательный. – Fish

+0

Sven, любой смысл поставить * перед z вычислять (* z)? Вычисление не имеет большого значения, спасибо. – Fish

+0

@Fish: Если вы знаете, что 'n' является' 3', вы можете написать 'для z1, z2, z3 в itertools.product (...)'. Поскольку вы не знаете 'n' заранее, вы не можете использовать распаковку последовательностей, а' z' - кортеж всех параметров. Я предполагаю, что 'calculate()' принимает 'n' параметры и распаковывает кортеж при вызове' calculate() '. –

0

itertools.product будет делать то, что вы хотите (и многое другое). К сожалению, он хочет, чтобы списки продуктов, он вычисляет в отдельные аргументы, например:

>>> list(itertools.product([1,2,3],[1,2,3])) 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] 

так на лице этого вам нужно сделать что-то вроде этого:

a=frange(0,1.0,0.01) 
for (z1,z2,z3) in itertools.product(a,a,a): calculate(z1,z2,z3) 

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

a=frange(0,1.0,0.01) 
for (z1,z2,z3) in itertools.product(*(3*[a])): calculate(z1,z2,z3) 

или

a=frange(0,1.0,0.01) 
for (z1,z2,z3) in apply(itertools.product, 3*[a]): calculate(z1,z2,z3) 
+0

(Свен М. написал свой ответ, пока я писал. Его лучше, потому что он знал о 'repeat' kwarg для' itertools.product', и я этого не делал. Я оставляю здесь свое место вместо того, чтобы его просто удалить случай, дополнительная информация может быть полезной для всех.) –

Смежные вопросы