python - Python中的网格搜索功能

标签 python function loops

我正在尝试编写一个参数搜索函数来遍历其中一个参数,并重复调用所有其他参数相同的函数,除了我正在搜索的参数。这是一些示例代码:

def worker1(a, b, c):
    return a + b + c


def worker2(d, e, f):
    return d * e * f


def search(model, params):
    res = []

    # Loop over one of the parameters and repeatedly append to res
    if model == 1:
        res.append(worker1(**params))
    elif model == 2:
        res.append(worker2(**params))

    return res

params = dict(a=1, b=2, c=3)
print search(1, params)

我有两个工作人员,他们的调用取决于我传递给 search()model 标志的值。我在这里试图解决的问题是在 if 语句上编写一个循环(在代码中注释),通过仅改变其中一个参数来重复调用 say worker1。我希望我的代码灵活 - 有时我想遍历 a 并保持 bc 相同,但有时我想循环通过 b 并保持 ac 相同。

我愿意接受建议的任何解决方案,但我想我会在 params 字典中指定搜索参数。例如。要在 1、2、3、4 上循环 a,我会说:

`params = dict(a=[1,2,3,4], b=2, c=3)`

另外,如果我不必修改 worker1worker2 的代码就好了。

谢谢!

最佳答案

你也许可以使用 itertools.product 来调用你的 workers 的所有参数组合:
http://docs.python.org/2/library/itertools.html#itertools.product

例如

from itertools import product

def worker1(a, b, c):
    return a + b + c

def worker2(d, e, f):
    return d * e * f

def search(model, *params):
    res = []

    # Loop over one of the parameters and repeatedly append to res
    for current_params in product(*params):
        if model == 1:
            res.append(worker1(*current_params))
        elif model == 2:
            res.append(worker2(*current_params))

    return res

print search(1, [1,2,3,4], [2], [3])

# more complicated combinations are possible:
print search(1, [1,2,3,4], [2,7,9], [3,13,23,43])

我避免使用关键字参数,因为您的工作函数采用不同名称的参数,所以它没有多大意义。

我假设您的工作函数实际上看起来不像上面的那样,您可以使用内置的 sumreduce 函数进一步简化代码.

关于python - Python中的网格搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754230/

相关文章:

python - 如何通过多个级别的 SQLAlchemy 关系检索一组对象?

c++ - 将输入验证为 double /整数的函数

python - 为什么x的内容消失了。关于 python 中正确性的推理?

python - 将多列连接成一列,同时复制其他列的值

Python - 使用 tablib 导入 Excel(xls、xlsx)文件

bash - 独立的 shell 脚本与 shell 函数?

r - 在向量上循环 uniroot

java - java 如何退出for循环?

python 在预期异常后返回到 try block

c - 将二维数组的程序拆分为函数 (C)