我有所有可能的参数值的字典(space_of_params),我需要生成所有可能的参数组合到字典中。输入字典中的键数(参数)不固定,可能会有所不同。
我输入了具有不同数量的params定义的词典:
space_of_params = {'param1':range(1,5),'param2':['a','b','c'],'param3'[True,False],....}
我需要将所有参数组合生成为dicts:
{'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}
等等......
答案 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
和zip
,并将我们从字典中提取的keys
转换为新字典。
答案 1 :(得分:1)
您可以这样使用itertools.product
:
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}
...