对所有可能的参数组合执行功能

Blu*_*ire 9 python combinations function

我有一组值要作为参数应用于函数:

params = {
    'a': [1, 2, 3],
    'b': [5, 6, 7],
    'x': [None, 'eleven', 'f'],
    # et cetera
}
Run Code Online (Sandbox Code Playgroud)

我想运行myfunc()与所有可能的组合,所以myfunc(a=1, b=5, x=None ...),myfunc(a=2, b=5, x=None ...)... myfunc(a=3, b=7, x='f' ...).是否有某些东西(例如in itertools)可以提供帮助?我想过使用itertools.product()但不保留参数的名称,只是给了我组合的元组.

fal*_*tru 11

您可以使用itertools.product获取所有参数组合:

>>> import itertools
>>> for xs in itertools.product([1,2], [5,6], ['eleven', 'f']):
...     print(xs)
... 
(1, 5, 'eleven')
(1, 5, 'f')
(1, 6, 'eleven')
(1, 6, 'f')
(2, 5, 'eleven')
(2, 5, 'f')
(2, 6, 'eleven')
(2, 6, 'f')
Run Code Online (Sandbox Code Playgroud)

使用Argument list解压缩,您可以myfunc使用关键字参数的所有组合进行调用:

params = {
    'a': [1, 2, 3],
    'b': [5, 6, 7],
    'x': [None, 'eleven', 'f'],
}

def myfunc(**args):
    print(args)

import itertools
keys = list(params)
for values in itertools.product(*map(params.get, keys)):
    myfunc(**dict(zip(keys, values)))
Run Code Online (Sandbox Code Playgroud)

输出:

{'a': 1, 'x': None, 'b': 5}
{'a': 1, 'x': None, 'b': 6}
{'a': 1, 'x': None, 'b': 7}
{'a': 1, 'x': 'eleven', 'b': 5}
{'a': 1, 'x': 'eleven', 'b': 6}
{'a': 1, 'x': 'eleven', 'b': 7}
{'a': 1, 'x': 'f', 'b': 5}
...
Run Code Online (Sandbox Code Playgroud)

  • `map(params.get,keys)`是一种在这里编写`params.values()`的不必要的冗长方式; 除非字典被修改,否则保证`.keys()`和`.values()`将对齐. (2认同)

Mos*_*oye 5

在所有 Python 版本中都保证.keys和 的顺序(除非 dict 被改变,这不会发生在这里),所以这可能有点微不足道:.values

from itertools import product

for vals in product(*params.values()):
    myfunc(**dict(zip(params, vals)))
Run Code Online (Sandbox Code Playgroud)

您可以在文档中找到保证:

如果在没有对字典进行干预的情况下迭代键、值和项目视图,项目的顺序将直接对应。


演示

for vals in product(*params.values()):
    print(dict(zip(params, vals)))
Run Code Online (Sandbox Code Playgroud)
{'a': 1, 'x': None, 'b': 5}
{'a': 1, 'x': None, 'b': 6}
{'a': 1, 'x': None, 'b': 7}
{'a': 1, 'x': 'eleven', 'b': 5}
{'a': 1, 'x': 'eleven', 'b': 6}
{'a': 1, 'x': 'eleven', 'b': 7}
{'a': 1, 'x': 'f', 'b': 5}
{'a': 1, 'x': 'f', 'b': 6}
{'a': 1, 'x': 'f', 'b': 7}
...
Run Code Online (Sandbox Code Playgroud)

  • 也许添加一个链接到 [guarantee](https://docs.python.org/3/library/stdtypes.html#dictionary-view-objects)? (2认同)
  • @DSM 是的,先生,包括在内。谢谢。 (2认同)