如何使用Python的filter函式

2021-10-13 10:22:39 字數 4323 閱讀 5503

python內建的filter()函式能夠從可迭代物件(如字典、列表)中篩選某些元素,並生成乙個新的迭代器。可迭代物件是乙個可以被「遍歷」的python物件,也就是說,它將按順序返回各元素,這樣我們就可以在for迴圈中使用它。

filter()函式的基本語法是:

filter(function, iterable)
返回乙個可迭代的filter物件,可以使用list()函式將其轉化為列表,這個列表包含過濾器物件中返回的所有的項。

filter()函式所提供的過濾方法,通常比用列表解析更有效,特別是當我們處理更大的資料集時。例如,列表解析會生成乙個新列表,這會增加該處理的執行時間。當列表解析執行完畢它的表示式後,記憶體中會有兩個列表。但是,filter()將生成乙個簡單的物件,該物件包含對原始列表的引用、提供的函式以及原始列表中位置的索引,這樣操作占用的記憶體更少。

下面介紹filter()的四種不同用法:

filter()的第乙個引數是乙個函式,用它來決定第二個引數所引用的可迭代物件中的每一項的去留。此函式被呼叫後,當返回false時,第二個引數中的可迭代物件裡面相應的值就會被刪除。針對這個函式,可以是乙個普通函式,也可以使用lambda函式,特別是當表示式不那麼複雜的時候。

下面是filter()中使用lambda函式的方法:

filter(lambda item: item expression, iterable)
將下面的列表,用於lambda函式,根據lambda函式表示式篩選列表中的元素。

creature_names = ['sammy', 'ashley', 'jo', 'olly', 'jackie', 'charlie']
要篩選此列表以母音開頭的水族館生物的名稱,lambda函式如下:

print(list(filter(lambda x: x[0].lower() in 'aeiou', creature_names)))
在這裡,我們將列表中的乙個項宣告為x,並以x[0]的方式訪問每個字串的第乙個字元,並且要將字母轉化為小寫,以確保將字母與'aeiou'中的字元匹配。

最後,要提供可迭代對向creature_name。與上一節一樣,用list()將返回結果轉化為列表表。

輸出如下:

['ashley', 'olly']
當然,寫乙個函式,也能夠實現類似的結果:

creature_names = ['sammy', 'ashley', 'jo', 'olly', 'jackie', 'charlie']

def names_vowels(x):

return x[0].lower() in 'aeiou'

filtered_names = filter(names_vowels, creature_names)

print(list(filtered_names))

names_vowels函式中用乙個表示式,完成了對creature_names的過濾。

同樣,輸出如下:

['ashley', 'olly']
總的來說,在filter()函式中使用lambda函式得到的結果與使用常規函式得到的結果相同。如果所要過濾資料更複雜了,還可能要使用正規表示式,這可能會提高**的可讀性。

我們也可以將none作為filter()的第乙個引數,讓迭代器過濾掉python中布林值是false的物件,比如長度為0的物件(如空列表或空字串)或在數字上等於0的物件。

下面的示例中要過濾乙個列表,去掉其中布林值是false的元素。

aquarium_tanks = [11, false, 18, 21, "", 12, 34, 0, , {}]

filtered_tanks = filter(none, aquarium_tanks)

這段**在filter()中使用了none,並將aquarium_tanks列表作為可迭代項傳入。將none作為第乙個引數,可以檢查列表中的元素是否為false

print(list(filtered_tanks))
然後再將filtered_tanks傳給list()函式,這樣就得到了乙個列表。

從輸出結果中可以看出,我們得到了想要的整數,那些布林值是false的項都篩選掉了。

[11, 25, 18, 21, 12, 34]
注意:如果不使用list()並列印filtered_tanks,將得到乙個類似於這樣的filter物件。filter物件是可迭代的,因此我們可以使用for迴圈它,也可以使用list()將其轉換為列表。

借助none,用filter()快速地從列表中刪除被認為false的項。

對於複雜的資料結構,filter()也可以勝任,例如,有乙個由字典組成的列表,我們不僅要遍歷列表中的每項(字典), 還可能要遍歷字典中的每個鍵值對,以便得到所有的資料。

舉個例子,假設我們有水族館裡每種生物的乙個列表以及每種生物的不同細節,用下面的列表顯示此資料。

aquarium_creatures = [

,  ,

,  ,

,  ]

下面就寫乙個函式,用這個函式來過濾這些資料。為了讓filter()訪問每個字典和字典中的每個元素,這需要構造乙個巢狀函式,如下所示:

def filter_set(aquarium_creatures, search_string):

def iterator_func(x):

for v in x.values():

if search_string in v:

return true

return false

return filter(iterator_func, aquarium_creatures)

定義filter_set()函式,以aquarium_creaturessearch_string作為引數。在filter_set()中,將內部函式iterator_func()作為filter()的引數。filter_set()函式將返回由filter()生成的迭代器。

iterator_func()x作為引數,它代表列表中的乙個項(即單個字典)。

接下來,for迴圈訪問字典中每個鍵值對,然後使用條件語句檢查search_string是鍵值對中的值。

iterator_func函式作為filter函式的引數物件,用它對迭代物件進行篩選。例如:用filter_set()搜尋字串:

filtered_records = filter_set(aquarium_creatures, "2")
一旦函式執行完畢,過濾器物件儲存在filtered_records變數中,我們將其轉換為乙個列表並列印:

print(list(filtered_records))
輸出內容:

[, , ]
剛才的示例中,我們用filter()實現了在字典組成的列表中過濾制定字元。

lucene中search內建的Filter

先來看一下rangefilter public static void printfilter string path throws ioexception system.out.println 其實這段 沒什麼,就增加了下面這段 rangefilter filter new rangefilter...

python3學習之map函式和filter函式

map 函式可以對乙個資料進行同等迭代操作。例如 def f x return x x r map f,1,2,3,4,5,6,7,8,9 print list r map函式傳入的第乙個引數就是函式本身,即f。第二個引數是要操作的資料 map 作為高階函式,事實上它把運算規則抽象了,因此,我們不 ...

FME如何使用Python?

安裝fme後,在fme的安裝路徑中,找到 fmeobjects 資料夾 c program files fme fmeobjects 在fmeobjects 資料夾中,我們可以看到名為python版本的資料夾,因fme的版本不同,支援的python版本有所差異 以fme 2018 x64為例 選擇需...