我正在尝试编写一个参数搜索函数来遍历其中一个参数,并重复调用所有其他参数相同的函数,除了我正在搜索的参数。这是一些示例代码:
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
并保持 b
和 c
相同,但有时我想循环通过 b
并保持 a
和 c
相同。
我愿意接受建议的任何解决方案,但我想我会在 params
字典中指定搜索参数。例如。要在 1、2、3、4 上循环 a
,我会说:
`params = dict(a=[1,2,3,4], b=2, c=3)`
另外,如果我不必修改 worker1
和 worker2
的代码就好了。
谢谢!
最佳答案
你也许可以使用 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])
我避免使用关键字参数,因为您的工作函数采用不同名称的参数,所以它没有多大意义。
我假设您的工作函数实际上看起来不像上面的那样,您可以使用内置的 sum
和 reduce
函数进一步简化代码.
关于python - Python中的网格搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20754230/