我正在尝试编写一个参数搜索函数来循环其中一个参数,并重复调用一个函数,其他所有参数都是相同的,而不是我正在搜索的参数。以下是一些示例代码:
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
并保持a
和b
相同,但有时我想循环遍历c
并保持{ {1}}和b
相同。
我打开了建议的解决方案,但我想我会在a
字典中指定搜索参数。例如。要循环c
超过1,2,3,4,我会说:
params
如果我不必修改a
和`params = dict(a=[1,2,3,4], b=2, c=3)`
的代码,也会很高兴。
谢谢!
答案 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,所以它没有多大意义。
我假设您的工作函数实际上看起来不像上面那些,就好像它们可以使用内置sum
和reduce
函数进一步简化代码一样。
答案 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]