Python 为什么reduce的lambda表达式不能按预期工作?
我只想计算文本中的空白,因此我希望函数返回Python 为什么reduce的lambda表达式不能按预期工作?,python,lambda,reduce,counting,Python,Lambda,Reduce,Counting,我只想计算文本中的空白,因此我希望函数返回2(因为有两个空白)而不是0表达式: >>> import functools >>> functools.reduce(lambda acc, val: acc + 1 if val == ' ' else 0, list("test test test"), 0) 0 被解析为 acc + 1 if val == ' ' else 0 因此,每当累加器遇到空间以外的任何东西时,累加器都会重置。因此,它应该是:
2
(因为有两个空白)而不是0
表达式:
>>> import functools
>>> functools.reduce(lambda acc, val: acc + 1 if val == ' ' else 0, list("test test test"), 0)
0
被解析为
acc + 1 if val == ' ' else 0
因此,每当累加器遇到空间以外的任何东西时,累加器都会重置。因此,它应该是:
(acc + 1) if val == ' ' else 0
或
甚至只是:
acc + (1 if val == ' ' else 0)
但是,当然,
str.count()
是达到这一目的的方法。调试lambda
s的简单方法是使用print()或(原始lambda内容)
。这是因为print
总是返回None
,因此Python总是在或之后执行该部分
将其应用于您的案例:
acc + (val == ' ')
其中打印:
import functools
functools.reduce(lambda acc, val: print(acc, val) or (acc + 1 if val == ' ' else 0), list("test test test"), 0)
这就解释了哪里出了问题:如果不是空白,就不要保留acc
umulator
有几种方法可以解决这个问题。出于调试的原因,我将保留打印文件
,但如果您真的想使用其中任何一种,您可能应该将其删除
一种方法是使用布尔运算在算术运算中表现为整数的事实:
0 t
0 e
0 s
0 t
0
1 t
0 e
0 s
0 t
0
1 t
0 e
0 s
0 t
0
每当累加器遇到空白时,就会向累加器添加1(True
),否则会添加0(False
)
或者简单的解决方案是只保留acc
:
functools.reduce(lambda acc, val: print(acc, val) or (acc + (val == ' ')), list("test test test"), 0)
但是有比使用reduce
和lambda
更好的方法来计算空白。例如:
functools.reduce(lambda acc, val: print(acc, val) or (acc + 1 if val == ' ' else acc), list("test test test"), 0)
这也适用于您的列表:
"test test test".count(" ")
或:
“test test”有什么问题吗?count(“”
?学习python,只是想习惯python的lambda。它应该是else acc
。如果您只是想熟悉lambda
s,那么将其与reduce
一起使用会模糊问题。。。也许可以在地图
或过滤器
中使用它们,使其专注于lambda,而不是减少
工作原理的细微差别。@bereal,非常感谢你,我的朋友,它正在工作!我花了太多时间,弄得我头破血流!原来是这么简单。
"test test test".count(" ")
list("test test test").count(" ") # but that's slower
from collections import Counter
cnts = Counter("test test test") # counts all letters
cnts[" "]