如何将参数集中发送到Python函数并在列表中收集结果?

时间:2013-06-22 10:10:54

标签: python

我尝试编写一个函数func_apply(func_name, **kwargs),在列表中接收func_name和参数值,然后将参数逐个应用到func_name,收集结果并作为列表返回。我需要这个高阶函数func_apply主要是为了抽象语法,因为我的应用程序经常需要将不同的参数值应用于各种函数并在批处理中收集结果。

def my_minus(x,y):
    return x-y

def my_divd(a,b):
    return a/b

def func_apply(func_name, **kwargs):
    '''apply the parameter in kwargs one by one to func_name,
       collect and return result in a list.
       for example: 
         func_apply(my_minus, x=[2, 4, 5, 7], y=[1, 4, 3, 9]) will return [1,0,2,-2], 
         func_apply(my_divd,  a=[2, 4, 5, 7], b=[1, 4, 3, 9]) will return [2,1,1.66,0.77]
    '''
    # the codes

那么,如何编写func_apply

1 个答案:

答案 0 :(得分:3)

您可以使用ziplist comprehension

kwargs这里是一个字典,因为dicts没有任何固定的顺序,所以你可能必须首先根据键获得一个排序的值列表。

>>> from __future__ import  division   # not required in py3.x
def func_apply(func_name, **kwargs):
    vals = [kwargs[key] for key in sorted(kwargs)] #sort the keys lexicographically
    return [func_name(*x) for x in  zip(*vals)]
... 
>>> func_apply(my_minus, x=[2, 4, 5, 7], y=[1, 4, 3, 9])
[1, 0, 2, -2]
>>> func_apply(my_divd,  a=[2, 4, 5, 7], b=[1, 4, 3, 9])
[2.0, 1.0, 1.6666666666666667, 0.7777777777777778]