生成所有参数的组合

时间:2017-04-16 19:02:41

标签: python

我有所有可能的参数值的字典(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}

等等......

2 个答案:

答案 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}]

我们首先要做的是将字典转换为键值元组列表。接下来,我们构建字典值的所有productzip,并将我们从字典中提取的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}
...