首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python reduce的明显限制中为continuations让路

从python reduce的明显限制中为continuations让路
EN

Stack Overflow用户
提问于 2019-01-31 02:39:58
回答 1查看 60关注 0票数 1

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

代码语言:javascript
复制
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)替换λ函数中的" if“条件。我的意思是,通过不显式地使用“if”条件来完成相同的事情。

我想通过传递一个lambda函数来得到一个解决方案,该函数将另一个lambda函数作为reduce函数的参数。但事实证明,这只是一个白日梦,因为在将lambda函数作为参数传递后,在外部lambda函数体内调用它将违背使其成为lambda函数的目的。

另一个失败是关于希望构造一个lambda函数可以在其主体的末尾调用自己。(我理解上面这行听起来完全没有意义,但我所指的是一个具有与lambda调用自身同等能力的构造)

我已经了解了延续传递风格的概念,在pythonic术语中,函数返回一个λ函数,该函数接受该函数收到的参数.But,我不确定从延续的定义来看,它在技术上是否准确。它能被用来解决这个问题吗?

EN

回答 1

Stack Overflow用户

发布于 2019-01-31 02:52:37

没有什么能阻止你写作

用like (x == 2)

拉姆达函数

代码语言:javascript
复制
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模块。Reference docs.

代码语言:javascript
复制
from functools import reduce, partial
import operator
reduce(operator.add,map(lambda x: operator.eq(x, 2), a_lst), 0) #Output: 4

并且,将lambda替换为部分函数

代码语言:javascript
复制
equals_2 = partial(operator.eq, 2)
reduce(operator.add,map(equals_2, a_lst), 0) #Output: 4

A Word of caution

在这种情况下,固守一种编程(函数式)范例可能并不明智。Python在允许任何编程范式方面都表现出色,但实际上超越了纯洁性。使用.count方法遍历列表并计算2的个数要简单得多。没有必要在没有意义的地方重新发明轮子。对于未来的读者,这只是一个演示,而不是关于如何计算列表中出现次数的建议。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54447411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档