从python中的函数列表中选择函数的子集

时间:2015-09-26 22:54:29

标签: python

我有一个清单:http://www.babynames.ir/esm/newcat/page1/number/... 我已经定义了许多在此列表上运行的函数。例如:

mylist = [1,2,5,4,7,8]

现在我给出了一个我想在mylist上应用的函数名列表。

代表:def mean(x): ... def std(x): ... def var(x): ... def fxn4(x): ... def fxn5(x): ... def fxn6(x): ... def fxn7(x): ...

调用这些函数的最pythonic方式是什么?

4 个答案:

答案 0 :(得分:5)

我认为没有pythonic™方法来解决这个问题。但在我的代码中,这是一个非常常见的情况,所以我已经为此编写了自己的函数:

def applyfs(funcs, args):
    """
    Applies several functions to single set of arguments. This function takes
    a list of functions, applies each to given arguments, and returns the list
    of obtained results. For example:

        >>> from operator import add, sub, mul
        >>> list(applyfs([add, sub, mul], (10, 2)))
        [12, 8, 20]

    :param funcs: List of functions.
    :param args:  List or tuple of arguments to apply to each function.
    :return:      List of results, returned by each of `funcs`.
    """
    return map(lambda f: f(*args), funcs)

在你的情况下,我会用以下方式使用它:

applyfs([mean, std, var, fxn4 ...], mylist)

请注意,您实际上不必使用函数名称(例如PHP4中必须这样做),Python函数本身就是可调用对象并且可以存储在列表中。

修改

或者可能,使用列表理解而不是map会更加pythonic:

results = [f(mylist) for f in [mean, std, var, fxn4 ...]]

答案 1 :(得分:3)

您可以通过以下名称获取功能:

map(globals().get, fxnOfInterest)

然后循环遍历它们并将它们应用到列表中:

[func(mylist) for func in map(globals().get, fxnOfInterest)]

答案 2 :(得分:0)

您可以使用eval

mylist = [1,2,5,4,7,8]
fxnOfInterest = ['mean', 'std', 'var', 'fxn6']
for fn in fxnOfInterest:
    print eval(fn+'(mylist)')

答案 3 :(得分:0)

试试这个例子,我认为没有什么比这更像pythonic, 我称之为函数调度程序。

dispatcher={'mean':mean,'std':std,'var':var,'fxn4':fxn4}
try:
    for w in fxnOfInterest :
        function=dispatcher[w]
        function(x)
except KeyError:
    raise ValueError('invalid input')

每次函数都会根据dispatcher字典获取值, 当你在罗马做罗马人时。