最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python中的reduce內建函數使用方法指南

 更新時間:2014年08月31日 09:22:44   投稿:hebedich  
python中的reduce內建函數是一個二元操作函數,他用來將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給reduce中的函數 func()(必須是一個二元操作函數)先對集合中的第1,2個數據進行操作,得到的結果再與第三個數據用func()函數運算,最后得到一個結果

官方解釋:

Apply function of two arguments cumulatively to the items of iterable, from left to right, so as to reduce the iterable to a single value. For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates ((((1+2)+3)+4)+5). The left argument, x, is the accumulated value and the right argument, y, is the update value from the iterable. If the optional initializer is present, it is placed before the items of the iterable in the calculation, and serves as a default when the iterable is empty. If initializer is not given and iterable contains only one item, the first item is returned. Roughly equivalent to:

意思就是說:將一個可迭代的對象應用到一個帶有兩個參數的方法上,我們稱之為appFun,遍歷這個可迭代對象,將其中的元素依次作為appFun的參數,但這個函數有兩個參數,作為哪個參數呢?有這樣的規(guī)則,看一下下面reduce方法的實現,有三個參數,第一個參數就是上面說的appFun,第二個參數就是那個可迭代的對象,而第三個呢?當調用reduce方法的時候給出了initializer這個參數,那么第一次調用appFun的時候這個參數值就作為第一個參數,而可迭代對象的元素依次作為appFun的第二個參數;如果調用reduce的時候沒有給出initializer這個參數,那么第一次調用appFun的時候,可迭代對象的第一個元素就作為appFun的第一個元素,而可迭代器的從第二個元素到最后依次作為appFun的第二個參數,除第一次調用之外,appFun的第一個參數就是appFun的返回值了。例如reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]),計算1到5的和,因為沒有給定initializer參數,所以第一次調用x+y時,x=1,即列表的第一個元素,y=2,即列表的第二個元素,之后返回的1+2的結果作為第二次調用x+y中的x,即上一次的結果,y=2,即第二個元素,依次類推,知道得到1+2+3+4+5的結果。

這樣看來,其實下面的代碼定義是有一點問題,我們在程序中調用這段代碼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) 

 
第二種:循環(huán)方式。

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的第三個參數,所以第一次執(zhí)行時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,所以第一次執(zhí)行時x=0,y=1,第二次x=0+1,y=2,即列表的第二個元素, 
假定指定reduce的第三個參數為100,那么第一次執(zhí)行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],統(tǒng)計這個集合所有鍵的重復個數,例如1出現了兩次,2出現了兩次等。大致的思路就是用字典存儲,元素就是字典的key,出現的次數就是字典的value。方法依然很多

第一種:for循環(huán)判斷

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的第一個參數,遍歷集合依次作為第二個參數 

通過上面的例子發(fā)現,凡是要對一個集合進行操作的,并且要有一個統(tǒng)計結果的,能夠用循環(huán)或者遞歸方式解決的問題,一般情況下都可以用reduce方式實現。

reduce函數真是“一位好同志啊”!

相關文章

  • Python os模塊中的isfile()和isdir()函數均返回false問題解決方法

    Python os模塊中的isfile()和isdir()函數均返回false問題解決方法

    這篇文章主要介紹了Python os模塊中的isfile()和isdir()函數均返回false問題解決方法,返回false的原因是路徑使用了相對路徑,使用絕對路徑就可以解決這個問題,需要的朋友可以參考下
    2015-02-02
  • python爬取足球直播吧五大聯賽積分榜

    python爬取足球直播吧五大聯賽積分榜

    這篇文章主要為大家詳細介紹了python爬取足球直播吧五大聯賽積分榜,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Python開發(fā)工具PyCharm的下載與安裝步驟圖文教程

    Python開發(fā)工具PyCharm的下載與安裝步驟圖文教程

    這篇文章主要為大家介紹了Python開發(fā)工具PyCharm的下載與安裝步驟圖文教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • django-rest-swagger對API接口注釋的方法

    django-rest-swagger對API接口注釋的方法

    今天小編就為大家分享一篇django-rest-swagger對API接口注釋的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python數據結構之遞歸可視化詳解

    Python數據結構之遞歸可視化詳解

    遞歸函數是直接調用自己或通過一系列語句間接調用自己的函數。遞歸在程序設計有著舉足輕重的作用,在很多情況下,借助遞歸可以優(yōu)雅的解決問題。本文主要介紹了如何利用可視化方式來了解遞歸函數的執(zhí)行步驟,需要的可以參考一下
    2022-04-04
  • 用Django實現一個可運行的區(qū)塊鏈應用

    用Django實現一個可運行的區(qū)塊鏈應用

    這篇文章主要介紹了用Django實現一個可運行的區(qū)塊鏈應用,需要的朋友可以參考下
    2018-03-03
  • tensorflow 1.X遷移至tensorflow2 的代碼寫法

    tensorflow 1.X遷移至tensorflow2 的代碼寫法

    本文主要介紹了tensorflow 1.X遷移至tensorflow2 的代碼寫法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • python 默認參數問題的陷阱

    python 默認參數問題的陷阱

    本文給大家講述的是python 默認參數問題的陷阱,有需要的小伙伴可以參考下
    2016-02-02
  • 詳解Python中xlsxwriter庫的基本操作

    詳解Python中xlsxwriter庫的基本操作

    xlsxwriter是一個用于創(chuàng)建和修改Excel文件(.xlsx)的Python庫,它提供了豐富的功能,可以創(chuàng)建復雜的Excel工作簿,本文為大家介紹了它的一些基本操作,希望對大家有所幫助
    2023-11-11
  • 如何利用python獲取鼠標點擊的實時位置案例

    如何利用python獲取鼠標點擊的實時位置案例

    這篇文章主要給大家介紹了關于如何利用python獲取鼠標點擊的實時位置,并展示了如何安裝和使用該庫,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12

最新評論

常宁市| 荆门市| 汝州市| 鸡泽县| 株洲市| 沾益县| 宕昌县| 辽阳县| 柳林县| 二连浩特市| 大厂| 南汇区| 建阳市| 昌图县| 巨鹿县| 宁蒗| 台北县| 河北省| 都兰县| 延庆县| 九龙县| 华容县| 休宁县| 永寿县| 余干县| 景泰县| 上蔡县| 商洛市| 鄢陵县| 沙河市| 始兴县| 锦州市| 通城县| 吐鲁番市| 黄冈市| 柳林县| 海阳市| 宾川县| 柳林县| 长乐市| 全南县|