在参数列表上映射函数列表(Python)

Tru*_*nes 4 python functional-programming cartesian-product

我有一个函数列表:listFunc = [g1,g2,g3].使用以下代码生成此列表:

def g(y): 
    def f(x):
        return x+y;
    return f; 
listFunc=list(map(g, [1, 2, 3])); 
Run Code Online (Sandbox Code Playgroud)

现在,我有一个参数列表ListArg = [4,5,6];

我怎样才能获得仅[g1(4), g1(5), g1(6), g2(4), g2(5), g2(6), g3(4), g3(5), g3(6)]使用的结果列表map

我想过使用以下代码:

map(lambda x:x(y), listFunc, ListArg)
Run Code Online (Sandbox Code Playgroud)

但它只给出了结果[g1(4), g2(5), g3(6)].

谢谢,

Sim*_*ser 5

如果你想使用map(),你可以这样做:

>>> [k for item in map(lambda x: [g(x) for g in listFunc], ListArg) for k in item]
[5, 6, 7, 6, 7, 8, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)


jua*_*aga 5

对于包含两个for-clauses的列表理解,这是一个完美的用例:

>>> def g1(x): return 1*x
... 
>>> def g2(x): return 2*x
... 
>>> def g3(x): return 3*x
... 
>>> funcs = [g1,g2,g3]
>>> args = [4,5,6]
>>> [f(a) for f in funcs for a in args]
[4, 5, 6, 8, 10, 12, 12, 15, 18]
>>> 
Run Code Online (Sandbox Code Playgroud)

这非常具有可读性和显着的功能 - 列表推导是从Haskell借来的.

如果您觉得有必要使用地图,那么您必须像这样接近它:

>>> import itertools
>>> list(map(lambda f,a : f(a), *zip(*itertools.product(funcs,args))))
[4, 5, 6, 8, 10, 12, 12, 15, 18]
Run Code Online (Sandbox Code Playgroud)

这显然是不可读的,而且可能更慢.列表理解在这里获胜.