我有一个参数列表,例如:
import numpy as np
param1 = np.arange(0., 1., 0.01)
param2 = np.arange(10., 8000., 100.)
...
我还有一个函数foo
,其中定义了一个关键字参数列表arg1, arg2, ...
及其默认值:
def foo(arg1=default1, arg2=default2, ...)
我需要做的是调用此函数,使用参数列表中的参数和值更改其中一个默认值(逐个),如下所示:
foo(arg1=param1[0])
foo(arg1=param1[1])
...
foo(arg2=param2[0])
foo(arg2=param2[0])
我想到的最好的方法是创建一个包含所有参数的字典,然后遍历键和值并从中创建一个新的临时字典,然后调用该函数:
all_params = {'arg1':param1, 'arg2':param2, ...}
for key, value_list in all_params.items():
for value in value_list:
tmp_dict = {key:value}
foo(**tmp_dict)
但我有一种感觉:1)我以非Pythonic的方式进行迭代,2)并且显然有更好的方法可以解决这个问题。
编辑:根据@ Sebastian的建议,简化了嵌套循环。
答案 0 :(得分:1)
我认为这相对简单。
def foo(a=0, b=0, c=0):
return a * b + c
args1 = [1, 2]
args2 = [3, 4, 5]
args3 = [6, 7]
args = [args1, args2, args3]
d = {}
for n, a in enumerate(args): # Enumerate through all of the parameters.
for val in a: # For each parameter, iterate through all of the desired arguments.
a = [0, 0, 0] # default_args
a[n] = val # Insert the relavent argument into the correct parameter location.
d[tuple(a)] = foo(*a) # Call the function and unpack all of the arguments.
# This dictionary holds the function arguments as keys the returned values for those arguments.
>>> d
{(0, 0, 6): 6,
(0, 0, 7): 7,
(0, 3, 0): 0,
(0, 4, 0): 0,
(0, 5, 0): 0,
(1, 0, 0): 0,
(2, 0, 0): 0}
答案 1 :(得分:0)
1)我正以非Pythonic的方式进行迭代
“Pythonic”是主观的。
2)显然有更好的方法可以解决这个问题 问题
不是这样,你目前正在做的是唯一可能的情况,考虑到你要通过关键字传递它们,并且你必须一次传递一个。
作为改进,您可以考虑同时传递所有参数。
MVCE:
首先,定义你的函数和字典:
In [687]: def foo(a, b, c):
...: print(a, b, c)
...:
In [688]: dict_ = {'a': [1, 2, 3], 'b' : [4, 5, 6], 'c' : [7, 8, 9]}
转换为iters的词典:
In [689]: dict_ = {k : iter(v) for k, v in dict_.items()}
运行你的循环:
In [690]: while True:
...: try:
...: foo(**{k : next(v) for k, v in dict_.items()})
...: except StopIteration:
...: break
...:
1 4 7
2 5 8
3 6 9
答案 2 :(得分:0)
您可以稍微简化迭代,这样您就不需要再次访问all_params[key]
,如下所示:
for key, param in all_params.items():
for value in param: