如何将值为列表的字典传递给函数

时间:2017-08-24 18:34:42

标签: python function numpy dictionary

我有一个参数列表,例如:

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的建议,简化了嵌套循环。

3 个答案:

答案 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: