簡體   English   中英

將 lambda 列表合並為一個

[英]Combine list of lambdas in a single one

在單個函數中組合 lambda 列表的 Pythonic 方法是什么? 例如:

lambdas = [lambda x, k=k: x+k for k in range(3)]

我想在與此類似的單個 lambda 中得到這一切,但不必輸入它:

f = lambda x: lambdas[2](lambdas[1](lambdas[0](x)))

您可以使用functools.reduce執行此操作,如下所示:

from functools import reduce
lambdas = [lambda x, k=k: x+k for k in range(3)]
# x = 0
reduce(lambda x, l: l(x), lambdas, x)
# -> l[2](l[1](l[0](x)))
# step_1 : x = x , l = lambda[0] -> lambda[0](x)
# step_2 : x = lambda[0](x), l = lambda[1] -> lambda[1](lambda[0](x))
# step_3 : x = lambda[1](lambda[0](x)), l = lambda[2] -> lambda[2](lambda[1](lambda[0](x)))

reduce函數被定義為正是您想要的。 另一種方法是使用簡單的 for 循環。

def f(x):
    for func in lambdas:
         x = func(x)
    return x

用 lambda 來做這件事似乎有點奇怪。

是否有任何具體原因導致我們不能:

def function_chainer(lambdas):
    def chained(x):
        for function in lambdas:
            x = function(x)
    return chained

這個解決方案不是單行的,但我相信它是 pythonic 的。

如果你真的需要單線,你可以使用 functools.reduce:

lambda x: functools.reduce(lambda a, f: f(a), lambdas, x)

reduce 的第一個參數控制應用每個后續元素的方式,第二個是可迭代的(這里 - 我們的 lambda 可迭代),最后一個是初始化器 - 我們要傳遞給那些 lambda 函數的第一個值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM