31

Pythonを使用して別のコードでいくつかのパラメーターテストを実行しようとしています。6つの独立したパラメーターをテストする必要がありますが、それらの可能なすべての組み合わせが必要です。

各パラメーターには、渡す必要のある最小値、最大値、およびステップ値があります。私の頭に浮かんだ最初の簡単な解決策は、次のような恐ろしいように見えるネストされたforループ構造でした。

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
                        '''

いいえ、決めました!これは成り立たない。ですから、私はこれを再帰的に行う方法、または少なくとも6回ネストしない方法を模索してきました。私はそうするための良い計画を本当に思いつくことができません。私にとって最大の障害は、各変数の最小値、最大値、およびステップ値が異なることです。

これまでの私の考えはあまり役に立ちません。再帰関数を機能させるように努力し続けていますが、関数内にforループをさらにネストしないと理解できません。ここでitertools.productへの参照をたくさん見てきましたが、それを機能させる方法もよくわかりません。

編集:私が行っているのは、パラメーターの組み合わせにちなんで名付けられたディレクトリを作成し、それらのパラメーターを使用してファイルを作成し、このファイルを使用して別のコードを実行し、そのコードからの出力を分析することです。最後のループを除いて、文字通りどのforループでも何もしていません。多くのパラメータには2つの値しかなく、10の値があるものもあれば、3つの値があるものもあります。

4

2 に答える 2

52

使用方法は次の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(....)
于 2012-06-24T03:33:19.377 に答える
16

おそらく次を使用できます:http itertools.product//docs.python.org/library/itertools.html#itertools.product

何かのようなもの

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

。。。6つの変数すべてが含まれているだけです。

于 2012-06-24T03:31:51.313 に答える