Python中的网格搜索功能

时间:2013-12-24 02:51:47

标签: 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)

我有两个工作人员,他们会根据我传递给model的{​​{1}}标记的值来调用它们。我试图解决的问题是在if语句上写一个循环(在代码中注释),通过改变其中一个参数来重复调用说search()。我希望我的代码具有灵活性 - 有时我想循环遍历worker1并保持ab相同,但有时我想循环遍历c并保持{ {1}}和b相同。

我打开了建议的解决方案,但我想我会在a字典中指定搜索参数。例如。要循环c超过1,2,3,4,我会说:

params

如果我不必修改a`params = dict(a=[1,2,3,4], b=2, c=3)` 的代码,也会很高兴。

谢谢!

2 个答案:

答案 0 :(得分:2)

您也许可以使用itertools.product使用params的所有组合来呼叫您的员工:
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])

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

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

答案 1 :(得分:1)

我不确定我是否理解了这个问题。检查这是否是您想要的(省略model参数):

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

>>> def search(params):
        params = params.values()
        var_param = filter(lambda p: type(p) == list, params)[0]
        other_params = filter(lambda p: p != var_param, params) 
        return [worker1(x, *other_params) for x in var_param]

>>> search({'a':2, 'b':[3,4,5], 'c':3})
[8, 9, 10]

假设:

  • worker1()的参数是可交换的(顺序无关紧要)。
  • 变量参数是list
  • 其他参数是单个值。

在上面的示例中,b是您要循环的变量参数

<强>更新

如果要保留函数worker1的参数顺序:

def search(params):
    params = params.items()
    var_param = filter(lambda t: type(t[1]) == list, params)[0]
    other_params = filter(lambda t: t != var_param, params)
    var_param_key = var_param[0]
    var_param_values = var_param[1] 
    return [worker1(**dict([(var_param_key, x)] + other_params)) for x in var_param_values]