日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

java filter函数的用法_5分钟掌握Python | Map、Reduce和Filter如何运用?

發布時間:2024/10/8 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java filter函数的用法_5分钟掌握Python | Map、Reduce和Filter如何运用? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文末有驚喜哦

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

一.Map

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

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

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

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

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

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

這是一個類的標準輸出,其實它返回的不是最后的結果,而是一個迭代器。我們在之前的文章當中已經介紹過了迭代器和生成器的相關概念,這里不多做贅述了。

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

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

簡單總結一下,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,得到的就是原數組的和。

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

三.MapReduce

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

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

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

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

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

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

最后,我們來看下filter。

Filter

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

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

而使用filter會非常方便:

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

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

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

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

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

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

今天的文章就是這些,如果覺得有所收獲,請順手點個在看或者轉發吧,你們的舉手之勞對我來說很重要。

End.

來源:TechFlow

本文為分享轉發,轉載請聯系原作者

總結

以上是生活随笔為你收集整理的java filter函数的用法_5分钟掌握Python | Map、Reduce和Filter如何运用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。