黄视频网站在线免费观看-黄视频网站在线看-黄视频网站在线观看-黄视频网站免费看-黄视频网站免费观看-黄视频网站免费

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > Python之map、reduce和filter

Python之map、reduce和filter

來源:千鋒教育
發布人:xqq
時間: 2023-11-07 13:01:34 1699333294

今天給大家介紹的是Python當中三個非常神奇的方法:map、reduce和filter。

不知道大家看到map和reduce的時候有沒有什么感覺,如果看過之前我們大數據系列介紹MapReduce文章的同學,想必有些印象。這個MapReduce不是一個分布式的計算方法么,怎么又變成Python中的方法了?其實原因很簡單,因為Python是一門很年輕的語言,它在發展的過程當中吸收了很多其他領域的精華,MapReduce就是其中之一。

對之前文章感興趣的同學可以點擊下方的鏈接,回顧一下之前MapReduce的內容。

大數據基石——Hadoop與MapReduce

mapmap除了地圖之外,另一個英文本意是映射。在C++和Java一些語言當中,將map進一步引申成了存儲key和value映射結構的容器。Python對這點做了區分,KV結構的容器命名成了dict,即字典,而map則回到了它的本意,也就是映射。

我們都知道,在數學領域,映射也是函數的定義。一個自變量通過某種映射,對應到一個因變量。同樣,在Python當中,map操作本質也是函數,不過它作用的范圍不再是單個變量,而是一個序列。換句話說,通過map我們可以省去循環操作,可以自動將一個容器當中的元素套用一個函數。

舉個簡單的例子,比如我們有一個坐標,我們希望知道它距離原點的距離。這個問題很簡單,我們寫一個計算距離的函數就可以解決:

defdis(point):

returnmath.sqrt(point[0]**2+point[1]**2)

那如果我有多個點需要計算距離,在map出現之前,我們只能用循環來解決問題:

points=[[0,1],[2,4],[3,2]]

forpointinpoints:

print(dis(point))

但是有了map之后,我們可以省去循環的操作,整個代碼簡化成了一行:

map(dis,points)

但是要注意,我們調用完map之后得到的結果不是一個list而是一個迭代器。我們直接將map返回的內容print出來,可以得到這樣一個結果:

>>>print(map(dis,points))

這是一個類的標準輸出,其實它返回的不是最后的結果,而是一個迭代器。我們在之前的文章當中已經介紹過了迭代器和生成器的相關概念,這里不多做贅述了,遺忘的同學可以點擊下方鏈接回顧一下之前的內容:

Python——五分鐘帶你弄懂迭代器與生成器

我們想要獲得完整的內容也很容易,我們只需要將它轉化成list類型即可:

>>>print(list(map(dis,points)))

[1.0,4.47213595499958,3.605551275463989]

以上過程還可以進一步簡化,還記得我們之前介紹過的匿名函數嗎?由于dis函數在我們的程序當中只會在map中用到,我們完全沒有必要單獨創建一個函數,我們可以直接傳入一個匿名函數搞定運算:

map(lambdax:math.sqrt(x[0]**2+x[1]**2),points)

簡單總結一下,map操作其實執行的是一個映射。它可以自動地將一個序列當中的內容通過制定的函數映射成另一個序列,從而避免顯式地使用循環來調用,在很多場景下可以大大地簡化代碼的編寫,可以很方便地將一個序列整體轉變成另一個結果。

reduce相比于map,reduce的操作稍稍難理解一點點。它也是規定一個映射,不過不是將一個元素映射成一個結果。而是將兩個元素歸并成一個結果。并且它并不是調用一次,而是依次調用,直到最后只剩下一個結果為止。

比如說我們有一個數組[a,b,c,d]和一個函數f,我們計算reduce(f,[a,b,c,d])其實就等價于f(f(f(a,b),c),d)。和map不同的是,reduce最后得到一個結果,而不是一個迭代器或者是list。

我們光說有些抽象,不妨來看一個例子,就看最簡單的一個例子:reduce函數接收兩個數,返回兩個數的和。那么顯然,我們依次調用reduce,得到的就是原數組的和。

fromfunctoolsimportreduce

deff(a,b):

returna+b

print(reduce(f,[1,2,3,4]))

最終得到的結果當然是10,同樣,我們也可以將reduce中的方法定義成匿名函數,一樣不影響最終的結果。

print(reduce(lambdax,y:x+y,[1,2,3,4]))

MapReduce既然我們map和reduce都有了,顯然我們可以將它們串聯起來使用,也就是分布式系統當中MapReduce的做法。雖然如果不手動使用線程池的話,Python并不會起多個線程來加速運算,但是至少可以簡化我們實現的代碼。我們還是舉經典的wordCount的例子,也就是文本計算詞頻。

套用map和reduce的功能,整個流程非常清晰,我們只需要在map階段對文本進行分詞,在reduce階段對分詞之后的結果進行匯總即可。

聽著好像非常容易,但是你實際去上手是寫不出來的。原因也很簡單,因為hadoop當中的Map和Reduce中間還有一層shuffle的操作,會自動地將key值相同的結果放到同一個reducer當中。在這個問題當中,key自然就是我們的word,由于相同的word被放到同一個reducer當中,我們只需要累加就行了。但是如果我們自己編寫mapreduce的話,由于缺少了中間數據重排的步驟,所以導致不能實現。

要解決也簡單,我們可以人為增加一個map階段代替hadoop當中的重排。相當于做了一個MapMapReduce,我們來看代碼:

fromcollectionsimportCounter,defaultdict

texts=['applebearpeachgrape','grapeorangepear']

#第一次map,將字符串轉成數組,每個單詞對應1

defmp1(text):

ret=[]

words=text.split('')

forwordinwords:

ret.append((word,1))

returnret

#第二次map,將數組轉成dict

defmp2(arr):

d=defaultdict(int)

fork,vinarr:

d[k]+=v

returnd

#reduce,合并dict

defrd(x,y):

x.update(y)

returnx

print(reduce(rd,map(mp2,map(mp1,texts))))

那如果我們不用多次MapReduce呢?也不是沒有辦法,需要取點巧,方法也簡單只要使用之前我們講解過的Counter類,就可以完美解決這個問題。我們來看代碼:

fromcollectionsimportCounter

texts=['applebearpeachgrape','grapeorangepear']

defmp(text):

words=text.split('')

returnCounter(words)

print(reduce(lambdax,y:x+y,map(mp,texts)))

由于我們使用了Counter,所以我們在map階段返回的結果就已經是詞頻的dict了,而在reduce階段我們只需要將它們全部累加起來就OK了。

最后,我們來看下filter。

filterfilter的英文是過濾,所以它的使用就很明顯了。它的用法和map有些類似,我們編寫一個函數來判斷元素是否合法。通過調用filter,會自動將這個函數應用到容器當中所有的元素上,最后只會保留運行結果是True的元素,而過濾掉那些是False的元素。

舉個例子,假設我們想要保留list當中的奇數而過濾掉偶數,我們當然可以直接操作,比如:

arr=[1,3,2,4,5,8]

[iforiinarrifi%2>0]

而使用filter會非常方便:

list(filter(lambdax:x%2>0,arr))

從這個例子當中可能看不出便捷,但是有的時候判斷的條件可能非常復雜,我們判斷的邏輯不能簡單地在list定義當中表達出來,這個時候使用filter則會容易得多。

最后,我們再看一個類似的用法。在itertools當中有一個方法叫做compress,通過compress我們可以實現根據一個序列的條件過濾另一個序列。

舉個簡單的例子,假設,我們有兩個數組:

student=['xiaoming','xiaohong','xiaoli','emily']

scores=[60,70,80,40]

我們想要獲取所有考試及格的同學的list,如果用常規做法基本上免不了使用循環,但是使用compress可以很方便地通過一行代碼實現:

fromitemtoolsimportcompress

>>>pass=[i>60foriinscores]

>>>print(pass)

[False,True,True,False]

>>>list(compress(student,pass))

['xiaohong','xiaoli']

需要注意的是filter和compress返回的都是一個迭代器,我們要獲取它們的值,需要手動轉換成list。

雖然在日常的開發當中不使用這三樣神器同樣可以工作,但是用上它們之后,會提升很多代碼的可讀性,節省很多無用的代碼。尤其是在面試的時候,很有可能就會給面試官留下不一樣的印象,也許結果也會不同。

以上內容為大家介紹了Python之map、reduce和filter,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。

tags: python培訓
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
精品久久久久久中文字幕2017| 国产成人女人在线视频观看 | 久久国产一久久高清| 日韩一级黄色大片| 国产精品1024在线永久免费| 国产美女在线一区二区三区| 久久国产精品自线拍免费| 美国一区二区三区| 99色播| 国产成人精品综合| 尤物视频网站在线观看| 久久99欧美| 日韩在线观看免费完整版视频| 日韩一级黄色片| 国产伦理精品| 国产一区二区福利久久| 精品在线观看国产| 欧美另类videosbestsex视频| 精品视频在线看| 一级女人毛片人一女人| 日日夜夜婷婷| 欧美爱爱网| 成人免费福利片在线观看| 999久久66久6只有精品| 日韩在线观看视频免费| 国产一区免费在线观看| 国产麻豆精品免费密入口| 一级女性全黄久久生活片| 欧美一级视频免费| 国产麻豆精品免费视频| 国产成人女人在线视频观看| 欧美日本二区| 国产亚洲男人的天堂在线观看| 久草免费在线观看| 九九精品久久| 久久99中文字幕| a级毛片免费全部播放| 香蕉视频久久| 你懂的国产精品| 亚洲 欧美 91| 精品视频在线观看一区二区三区| 国产不卡福利| 香蕉视频一级| 欧美a免费| 国产精品1024永久免费视频| 日韩专区在线播放| 久久99中文字幕| 九九久久99综合一区二区| 国产一区二区精品久久91| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 欧美爱爱网| 精品久久久久久中文| 高清一级毛片一本到免费观看| 99热精品在线| 欧美一区二区三区在线观看| 欧美国产日韩一区二区三区| 91麻豆精品国产综合久久久| 麻豆系列 在线视频| 一 级 黄 中国色 片| 人人干人人草| 黄色福利片| 精品久久久久久免费影院| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 欧美一级视频免费| 99久久精品国产免费| 成人影视在线观看| 欧美另类videosbestsex视频| 国产伦久视频免费观看视频| 日日日夜夜操| 一级女人毛片人一女人| 黄色福利| 香蕉视频一级| 亚久久伊人精品青青草原2020| 精品视频一区二区三区免费| 青青久久网| 九九干| 欧美一区二区三区在线观看| 国产韩国精品一区二区三区| 精品视频在线看| 尤物视频网站在线观看| 精品视频在线观看一区二区三区| 欧美激情一区二区三区视频高清| 午夜激情视频在线观看| 欧美电影免费| 天堂网中文字幕| 999久久狠狠免费精品| 日本特黄一级| 香蕉视频一级| 欧美另类videosbestsex高清 | 深夜做爰性大片中文| 夜夜操天天爽| 高清一级淫片a级中文字幕| 99久久精品费精品国产一区二区| 国产91精品一区| 精品视频在线观看一区二区三区| 国产视频一区在线| 一 级 黄 中国色 片| 成人免费网站久久久| 99久久精品费精品国产一区二区| 四虎影视精品永久免费网站 | 国产91精品一区| 精品毛片视频| 深夜做爰性大片中文| 天天做日日爱夜夜爽| 成人a大片高清在线观看| 国产成人啪精品| 日韩一级黄色片| 欧美日本韩国| 国产成人啪精品| 韩国毛片基地| a级毛片免费全部播放| 国产精品1024永久免费视频| 亚洲女人国产香蕉久久精品| 亚洲女人国产香蕉久久精品| 黄视频网站免费观看| 九九九国产| 香蕉视频三级| 高清一级淫片a级中文字幕| 91麻豆精品国产自产在线观看一区| 韩国毛片免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩免费在线视频| 国产视频在线免费观看| 精品久久久久久中文| 国产伦精品一区三区视频| 久草免费在线视频| 成人免费观看男女羞羞视频| 一级毛片视频播放| 久久精品成人一区二区三区| a级毛片免费全部播放| 欧美激情一区二区三区中文字幕| 日日爽天天| 日韩中文字幕一区二区不卡| 色综合久久久久综合体桃花网| 精品在线视频播放| 精品视频免费看| 精品毛片视频| 国产91丝袜在线播放0| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 亚洲天堂免费| 免费国产在线观看不卡| 韩国三级香港三级日本三级la| 国产不卡在线观看| 国产亚洲男人的天堂在线观看| 国产视频一区二区在线观看 | 色综合久久天天综合绕观看| 国产一区二区精品久久| 色综合久久天天综合观看| 久久99中文字幕久久| 999久久狠狠免费精品| 国产麻豆精品高清在线播放| 国产伦精品一区二区三区无广告 | 久久成人综合网| 九九久久国产精品| 一本高清在线| 精品国产一区二区三区久久久狼| 国产伦精品一区三区视频| 久久久成人影院| 免费国产在线观看| 日韩在线观看视频免费| 午夜激情视频在线观看| 黄视频网站在线观看| 国产一区二区精品| 久久国产一区二区| 日韩一级黄色片| 日韩男人天堂| 香蕉视频久久| 黄视频网站在线观看| 日韩中文字幕在线亚洲一区 | 免费国产一级特黄aa大片在线| 成人免费高清视频| 成人免费网站视频ww| 国产精品1024永久免费视频| 九九久久国产精品| 久久国产精品自由自在| 欧美激情一区二区三区在线| 美女免费黄网站| a级毛片免费全部播放| 免费的黄色小视频| 亚洲精品中文一区不卡| 日韩在线观看视频免费| 国产一区二区精品久久| 四虎影视库国产精品一区| 国产a视频| 国产福利免费视频| 亚洲第一页乱| 欧美大片毛片aaa免费看| a级毛片免费观看网站| 成人a大片高清在线观看| 999久久狠狠免费精品| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 免费的黄视频| 亚洲 国产精品 日韩| 精品视频一区二区三区免费| 天堂网中文字幕| 天天色成人| 青草国产在线| 国产精品123| 欧美大片a一级毛片视频| 色综合久久手机在线|