2017-04-16 17 views
2

私は可能なすべてのパラメータの値の辞書(space_of_params)を持っており、可能なすべてのパラメータの組み合わせを辞書に生成する必要があります。入力ディクショナリ内のキー(パラメータ)の数は固定されておらず、異なる場合があります。すべてのパラメータの組み合わせを生成

私はのparamsのdefinions数の異なる入力辞書があります。

space_of_params = {'param1':range(1,5),'param2':['a','b','c'],'param3'[True,False],....} 

そして、私はdictsへのparamsのすべての組み合わせを生成する必要があります。

{'param1':1, 'param2':a, 'param3': True} 
{'param1':1, 'param2':b, 'param3': True} 
{'param1':1, 'param2':c, 'param3': True} 
{'param1':1, 'param2':a, 'param3': False} 
{'param1':1, 'param2':b, 'param3': False} 
{'param1':1, 'param2':c, 'param3': False} 

などなどを...

答えて

1

from itertools import product 

lst = [dict(zip(params, v)) for v in product(*space_of_params.values())] 

これは、リストを生成します、そしてあなたはそれを印刷する場合、あなたは望ましい結果が得られます:

for item in lst: 
    print item 

{'param3': True, 'param2': 'a', 'param1': 1} 
{'param3': True, 'param2': 'a', 'param1': 2} 
{'param3': True, 'param2': 'a', 'param1': 3} 
{'param3': True, 'param2': 'a', 'param1': 4} 
{'param3': True, 'param2': 'b', 'param1': 1} 
{'param3': True, 'param2': 'b', 'param1': 2} 
{'param3': True, 'param2': 'b', 'param1': 3} 
{'param3': True, 'param2': 'b', 'param1': 4} 
{'param3': True, 'param2': 'c', 'param1': 1} 
{'param3': True, 'param2': 'c', 'param1': 2} 
{'param3': True, 'param2': 'c', 'param1': 3} 
{'param3': True, 'param2': 'c', 'param1': 4} 
... 
+0

私がまさに必要です... –

1

あなたはこのためにカスタムメイドのアルゴリズムを書くことができますが、私の推測では、itertools.product関数の周りにいくつかのロジックを書くほうが良いでしょう:

from itertools import product 

def dict_product(**args): 
    tupargs = list(args.items()) 
    keys = list(map(lambda x:x[0],tupargs)) 
    for item in product(*map(lambda x:x[1],tupargs)): 
     yield dict(zip(keys,item))

これが生成します。

>>> space_of_params = {'param1':range(1,5),'param2':['a','b','c'],'param3':[True,False]} 
>>> list(dict_product(**space_of_params)) 
[{'param1': 1, 'param2': 'a', 'param3': True}, {'param1': 1, 'param2': 'a', 'param3': False}, {'param1': 1, 'param2': 'b', 'param3': True}, {'param1': 1, 'param2': 'b', 'param3': False}, {'param1': 1, 'param2': 'c', 'param3': True}, {'param1': 1, 'param2': 'c', 'param3': False}, {'param1': 2, 'param2': 'a', 'param3': True}, {'param1': 2, 'param2': 'a', 'param3': False}, {'param1': 2, 'param2': 'b', 'param3': True}, {'param1': 2, 'param2': 'b', 'param3': False}, {'param1': 2, 'param2': 'c', 'param3': True}, {'param1': 2, 'param2': 'c', 'param3': False}, {'param1': 3, 'param2': 'a', 'param3': True}, {'param1': 3, 'param2': 'a', 'param3': False}, {'param1': 3, 'param2': 'b', 'param3': True}, {'param1': 3, 'param2': 'b', 'param3': False}, {'param1': 3, 'param2': 'c', 'param3': True}, {'param1': 3, 'param2': 'c', 'param3': False}, {'param1': 4, 'param2': 'a', 'param3': True}, {'param1': 4, 'param2': 'a', 'param3': False}, {'param1': 4, 'param2': 'b', 'param3': True}, {'param1': 4, 'param2': 'b', 'param3': False}, {'param1': 4, 'param2': 'c', 'param3': True}, {'param1': 4, 'param2': 'c', 'param3': False}] 

私たちは、このように最初に何のキーと値のタプルのリストに辞書を変換しています。次に、辞書の値のうちproductをすべて構成し、辞書から新しい辞書に抽出したkeysを使用してzipを作成します。

あなたがこの方法で itertools.productを使用することができます
関連する問題