Python reduce原來是這樣用的

2022-07-04 08:54:08 字數 3261 閱讀 2393

官方解釋:

這樣看來,其實下面的**定義是有一點問題,我們在程式中呼叫這段**reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),得到的結果為16,而正確的結果為15,問題在於如果集合不是以0開始,那麼按照如下**,第一次呼叫x=1,即第乙個元素,y也是等於1,也是第乙個元素,而正確的y應該是2。所以真正的reduce方法應該和下面的例子是有差別的。

def reduce(function, iterable, initializer=none):

it = iter(iterable)

if initializer is none:

try:

initializer = next(it)

except stopiteration:

raise typeerror('reduce() of empty sequence with no initial value')

accum_value = initializer

for x in iterable:

accum_value = function(accum_value, x)

return accum_value

那麼reduce函式能做什麼,什麼情況下要用reduce呢,看下面的例子:

例如上面的例子,實現乙個整形集合的累加。假設lst = [1,2,3,4,5],實現累加的方式有很多:

第一種:用sum函式。

sum(lst)

第二種:迴圈方式。

def customer_sum(lst):

result = 0

for x in lst:

result+=x

return result

#或者def customer_sum(lst):

result = 0

while lst:

temp = lst.pop(0)

result+=temp

return result

if __name__=="__main__":

lst = [1,2,3,4,5]

print customer_sum(lst)

第三種:遞推求和

def add(lst,result):

if lst:

temp = lst.pop(0)

temp+=result

return add(lst,temp)

else:

return result

if __name__=="__main__":

lst = [1,2,3,4,5]

print add(lst,0)

第四種:reduce方式

lst = [1,2,3,4,5]

print reduce(lambda x,y:x+y,lst)

#這種方式用lambda表示當做引數,因為沒有提供reduce的第三個引數,所以第一次執行時x=1,y=2,第二次x=1+2,y=3,即列表的第三個元素

#或者lst = [1,2,3,4,5]

print reduce(lambda x,y:x+y,lst,0)

#這種方式用lambda表示當做引數,因為指定了reduce的第三個引數為0,所以第一次執行時x=0,y=1,第二次x=0+1,y=2,即列表的第二個元素,

假定指定reduce的第三個引數為100,那麼第一次執行x=100,y仍然是遍歷列表的元素,最後得到的結果為115

#或者def add(x,y):

return x+y

print reduce(add, lst)

#與方式1相同,只不過把lambda表示式換成了自定義函式

#或者def add(x,y):

return x+y

print reduce(add, lst,0)

#與方式2相同,只不過把lambda表示式換成了自定義函式

再舉乙個例子:有乙個序列集合,例如[1,1,2,3,2,3,3,5,6,7,7,6,5,5,5],統計這個集合所有鍵的重複個數,例如1出現了兩次,2出現了兩次等。大致的思路就是用字典儲存,元素就是字典的key,出現的次數就是字典的value。方法依然很多

第一種:for迴圈判斷

def statistics(lst):

dic = {}

for k in lst:

if not k in dic:

dic[k] = 1

else:

dic[k] +=1

return dic

lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]

print(statistics(lst))

第二種:比較取巧的,先把列表用set方式去重,然後用列表的count方法

def statistics2(lst):

m = set(lst)

dic = {}

for x in m:

dic[x] = lst.count(x)

return dic

lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]

print statistics2(lst)

第三種:用reduce方式

def statistics(dic,k):

if not k in dic:

dic[k] = 1

else:

dic[k] +=1

return dic

lst = [1,1,2,3,2,3,3,5,6,7,7,6,5,5,5]

print reduce(statistics,lst,{})

#提供第三個引數,第一次,初始字典為空,作為statistics的第乙個引數,然後遍歷lst,作為第二個引數,然後將返回的字典集合作為下一次的第乙個引數

或者d = {}

d.extend(lst)

print reduce(statistics,d)

#不提供第三個引數,但是要在保證集合的第乙個元素是乙個字典物件,作為statistics的第乙個引數,遍歷集合依次作為第二個引數

通過上面的例子發現,凡是要對乙個集合進行操作的,並且要有乙個統計結果的,能夠用迴圈或者遞迴方式解決的問題,一般情況下都可以用reduce方式實現。

reduce函式真是「一位好同志啊」!

HTML,原來是它們

在學習完牛腩新聞發布系統之後,才發現自己每天瀏覽的網頁是怎麼來的。原來,看起來很高大上的網頁自己也可以做得有模有樣。接下來的學習,應該就是具體知識細節的學習了。html的知識很簡單,也很基礎。html,超文字標記語言,標準通用標記語言下的乙個應用。web網頁也是一種文件,html就是用於編寫這種文件...

for迴圈原來是這樣

for迴圈可以說是程式中最靈活,最常用,最重要的乙個迴圈用法,大家經常用到,但是你真正理解for迴圈的執行原理嗎?舉個例子 for i 0 i 8 i 對於這個語句執行結束的時候 i 是多少?經常用,卻沒怎麼注意,執行結束的時候 i 是8 下面說一下for迴圈語句的執行過程 for 表示式1 表示式...

大學原來是這麼美好

人的一生會失去很多東西,有的追逐一生也得不到,有的短暫的擁有卻最終失去!我們一生都在為這些得到與得不到而苦腦 徘徊。我的大學時光也就這樣在揮揮噁噁的荒度了!記得大二時曾看過一部 大學我被你上了 記得當時在圖書館偶然看到這本書的時候,還以為是講一段美妙的大學愛情故事呢,等近不急待的看完了整部 才發現原...