让我们考虑一个包含以下数字的列表:
a_lst = [1,2,3,2,3,4,5,6,2,2]
现在,我需要用python编写一个程序,该程序仅使用“ reduce”来计算“ 2”的出现次数。
我也遇到了以下问题:
using Python reduce Count the number of occurrence of character in string
它有一个很好的答案,但是我想看看是否有什么方法可以 我可以用like(x == 2)替换lambda函数内部的“ if”条件。我的意思是通过不显式使用“ if”条件来完成相同的事情。
我想通过传递一个lambda函数来达到解决方案,该函数将另一个lambda函数作为reduce函数的参数。 但是事实证明,这只是白日做梦,没有其他事情,因为在将lambda函数作为参数传递之后,在外部lambda函数主体内调用它会破坏使它成为lambda函数的目的。
另一个惨败是关于希望有一个lambda函数可以在其主体末端调用自身的构造。 (我理解上一行听起来完全没有意义,但是我的意思是一种具有与调用自身的lambda等效的功能的结构)
我已经经历了延续传递样式的概念,其中用pythonic术语来说,一个函数返回一个lambda函数,该函数接受该函数已接收的参数。但是我不确定延续定义是否在技术上是准确的。可以用来解决这个问题吗?
答案 0 :(得分:2)
没有什么可以阻止您写作
具有(x == 2)的lambda函数
at
之所以可行,是因为bool是python中int的子类,可以用于数学运算。
但是,如果仅凭此一个令您不满意的话,您就可以真正参与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
和operator
模块。 Reference docs.
functools
,然后将lambda替换为部分函数
from functools import reduce, partial
import operator
reduce(operator.add,map(lambda x: operator.eq(x, 2), a_lst), 0) #Output: 4
请注意
在这种情况下,陷入一种编程范例(函数式)可能不是明智的选择。 Python擅长于允许任何编程范例,但实际上超过了纯净度。使用equals_2 = partial(operator.eq, 2)
reduce(operator.add,map(equals_2, a_lst), 0) #Output: 4
方法遍历列表并自己计算2s的数量将变得更加简单容易。无需在没有意义的地方重新发明轮子。对未来的读者来说,这只是一个演示,而不是关于如何计算列表中出现次数的建议。