2017-08-16 83 views
1
>>> import functools 
>>> functools.reduce(lambda acc, val: acc + 1 if val == ' ' else 0, list("test test test"), 0) 
0 

我只是想計算文本中的空格,所以我期望函數返回2(因爲有兩個空格)而不是0爲什麼我的lambda表達式減少不能按預期工作?

+7

出了什麼問題' 「測試測試測試」 .Count中(」「)'? – CoryKramer

+0

學習python,只是想習慣python的lambda表達式。 –

+3

它應該是'else acc'。 – bereal

回答

1

表達:

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()是去那裏的路上。

1

調試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) 

但也有更好的方法來計算空格比使用reducelambda。例如:

"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[" "] 
相關問題