>>> import functools
>>> functools.reduce(lambda acc, val: acc + 1 if val == ' ' else 0, list("test test test"), 0)
0
我只是想計算文本中的空格,所以我期望函數返回2
(因爲有兩個空格)而不是0
。爲什麼我的lambda表達式減少不能按預期工作?
>>> import functools
>>> functools.reduce(lambda acc, val: acc + 1 if val == ' ' else 0, list("test test test"), 0)
0
我只是想計算文本中的空格,所以我期望函數返回2
(因爲有兩個空格)而不是0
。爲什麼我的lambda表達式減少不能按預期工作?
表達:
acc + 1 if val == ' ' else 0
被解析爲
(acc + 1) if val == ' ' else 0
所以,累加器被複位每遇到什麼,但空間的時間。因此,它應該是:
acc + 1 if val == ' ' else acc
或
acc + (1 if val == ' ' else 0)
甚至只是:
acc + (val == ' ')
但是,當然,str.count()
是去那裏的路上。
調試lambda
s的簡單方法是使用print() or (original lambda content)
。這是有效的,因爲print
總是返回None
,因此Python將始終執行or
之後的部分。
將其應用於您的情況:
import functools
functools.reduce(lambda acc, val: print(acc, val) or (acc + 1 if val == ' ' else 0), list("test test test"), 0)
它打印:
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
這給出了一個解釋了什麼問題:不要將你的acc
umulator的情況下,它不是一個空白。
有幾種方法可以解決這個問題。出於調試的原因,我會保留print
,但如果您真的想使用其中的任何一種,您可能應該將其刪除。
一個將是使用一個事實,即布爾表現得像整數如果在算術運算中使用:每當遇到一個空白否則它添加0(False
)
functools.reduce(lambda acc, val: print(acc, val) or (acc + (val == ' ')), list("test test test"), 0)
這增加了1(True
)到累加器。
還是微不足道的解決方案,只保留acc
:
functools.reduce(lambda acc, val: print(acc, val) or (acc + 1 if val == ' ' else acc), list("test test test"), 0)
但也有更好的方法來計算空格比使用reduce
和lambda
。例如:
"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[" "]
出了什麼問題' 「測試測試測試」 .Count中(」「)'? – CoryKramer
學習python,只是想習慣python的lambda表達式。 –
它應該是'else acc'。 – bereal