python內建的filter()
函式能夠從可迭代物件(如字典、列表)中篩選某些元素,並生成乙個新的迭代器。可迭代物件是乙個可以被「遍歷」的python物件,也就是說,它將按順序返回各元素,這樣我們就可以在fo
r迴圈中使用它。
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_creatures
和search_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為例 選擇需...