2011-03-16 14 views
0

与えられた数式のすべての可能性を計算するために繰り返しを行いたいと思います。ネストされた繰り返しを書き留める必要がありますが、それを正しくすることはできませんでした。n個の値の反復

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

およびIのように適切に動作します。私はすべての可能性(%0〜100%)3定数{Z1、Z2、Z3}値を計算するためのアルゴリズム:(

が得意ではないです、Iを調製しましたzがn個の値で構成され、リストの場合はどのように私は、ネストされた反復を作成することができますか?あなたがこれを処理するために、私にお勧めしますどのアルゴリズム、(nは私の場合は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もし本当にこれが100**30 = 10**60以上の値を繰り返すだろう、30だろう。待つ準備ができている。

+0

私はこのようなモジュールが存在するかどうか知りませんでした:)ありがとう、Pythonは素晴らしいです。 – Fish

+0

Sven、*の前に*をつける意味はどれも計算する(* z)?計算は大きな問題ではありません。 – Fish

+0

@Fish: 'n 'が' 3'であることがわかったら、itertools.product(...)に 'z1、z2、z3のために'を書くことができます。 'n'をあらかじめ知っていないので、シーケンスアンパックを使うことはできません。また、' z'はすべてのパラメータのタプルです。私は 'calculate()'が 'n'パラメータをとり、' calculate() 'を呼び出すときにタプルをアンパックすると仮定します。 –

0

itertools.productは、あなたが望む(そしてそれ以上の)ことを行います。あなたが使用したい場合は

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

しかし:ので、あなたがこのような何かをする必要があり、それの顔に

>>> 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(*(3*[a])): calculate(z1,z2,z3) 

または

を言うことができる製品の数が異なるため正確なコード
+0

(Sven M.は私が私の手紙を書いている間に彼の答えを掲示した。彼はitertools.productのための 'repeat' kwargを知っていたので、彼はもっと良かった。特別な冗長性は誰にとっても役立ちます)。 –

関連する問題