あなたはこのためにカスタムメイドのアルゴリズムを書くことができますが、私の推測では、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
を使用することができます
私がまさに必要です... –