从python reduce的明显限制为延续让路



让我们考虑一个包含如下数字的列表:

a_lst = [1,2,3,2,3,4,5,6,2,2]

现在我需要用python编写一个程序,它只使用"reduce"来计算"2"的出现次数。

我也回答了以下问题:

使用Python reduce计算字符串中字符的出现次数

它得到了一个很好的答案,但我想看看是否有办法我可以用like(x==2)替换lambda函数中的"if"条件。我的意思是通过不显式使用"if"条件来完成同样的事情。

我想通过传递一个lambda函数来找到一个解决方案,该函数将另一个lambda函数作为reduce函数的参数。但事实证明,这只是一个白日梦,没有其他任何事情,因为在将lambda函数作为参数传递之后,在外部lambda函数体内部调用它将无法实现使其成为lambda函数的目的。

另一个失败是希望有一个lambda函数可以在其体的末尾调用自己的构造。(我理解上面这句话听起来完全没有意义,但我所指的是一个具有lambda调用自身的等效功率的构造)

我已经了解了延续传递样式的概念,在Python术语中,函数返回一个lambda函数,该函数接受函数接收到的参数。但我不确定延续的定义在技术上是否准确。它能用来解决这个问题吗?

没有什么可以阻止您编写

具有类似(x==2)的lambda函数

from functools import reduce
a_lst = [1,2,3,2,3,4,5,6,2,2]
reduce(lambda x, y: x + (y == 2), a_lst, 0) #Output: 4

这之所以有效,是因为bool是python中int的一个子类,可以用于数学运算。

然而,如果仅凭这一点还不能让您满意,那么您可以真正参与operatorfunctools模块。参考文档。

from functools import reduce, partial
import operator
reduce(operator.add,map(lambda x: operator.eq(x, 2), a_lst), 0) #Output: 4

和,用部分函数代替lambda

equals_2 = partial(operator.eq, 2)
reduce(operator.add,map(equals_2, a_lst), 0) #Output: 4

提醒
在这种情况下,拘泥于一种编程范式(函数式)可能是不明智的。Python擅长于允许任何编程范式,但实际上胜过了纯粹性。使用.count方法迭代列表并自己计算2的数量要简单得多。没有必要在没有意义的地方重新发明轮子。对于未来的读者来说,这只是一个演示,而不是关于如何计算列表中出现次数的建议。

相关内容

最新更新