Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么reduce的lambda表达式不能按预期工作?_Python_Lambda_Reduce_Counting - Fatal编程技术网

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[" "]