来自 dict 的嵌套循环的所有变体

end*_*nda 1 python dictionary loops nested-loops python-3.x

我有一个嵌套循环,它将组装参数的所有变体。参数越多,嵌套就越大。

for param1 in [1,2,3]:
    for param2 in [5,10,15]:
        for param3 in [10,11,12]:
            for param4 in [35,36,37]:
                for param5 in [2,4,6]:
                    params  = {
                        'param1': param1,
                        'param2': param2,
                        'param3': param3,
                        'param4': param4,
                        'param5': param5,
                    }
                    run_test(params)
Run Code Online (Sandbox Code Playgroud)

为了使代码更具可读性,希望将所有变体放入一个 dict 中,然后创建上面的循环。但如何实现这一目标?

configuration  = {
    'param1': [1,2,3],
    'param2': [5,10,15],
    'param3': [10,11,12],
    'param4': [35,36,37],
    'param5': [2,4,6],
}
Run Code Online (Sandbox Code Playgroud)

所需的输出是一个字典列表

[
    {
        'param1': param1,
        'param2': param2,
        'param3': param3,
        'param4': param4,
        'param5': param5,
    },
    { next dict …}
]
Run Code Online (Sandbox Code Playgroud)

笛卡尔乘积会工作,如果输入的是list of lists,但我有一个输入这是一个dict of lists 关于如何improove第一个解决方案这是非常欢迎的建议

tom*_*mjn 6

您可以使用仍然使用itertools.product,只需zip返回键和值

import itertools 

configuration  = {
    'param1': [1,2,3],
    'param2': [5,10,15],
    'param3': [10,11,12],
    'param4': [35,36,37],
    'param5': [2,4,6],
}

for i in itertools.product(*configuration.values()):
    params = dict(zip(configuration.keys(), i))
    run_test(params)
Run Code Online (Sandbox Code Playgroud)