本節書摘來自異步社群《python cookbook(第3版)中文版》一書中的第1章,第1.16節,作者[美]david beazley , brian k.jones,陳舸 譯,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。
序列中含有一些資料,我們需要提取出其中的值或根據某些标準對序列做删減。
要篩選序列中的資料,通常最簡單的方法是使用清單推導式(list comprehension)。例如:
使用清單推導式的一個潛在缺點是如果原始輸入非常大的話,這麼做可能會産生一個龐大的結果。如果這是你需要考慮的問題,那麼可以使用生成器表達式通過疊代的方式産生篩選的結果。例如:
有時候篩選的标準沒法簡單地表示在清單推導式或生成器表達式中。比如,假設篩選過程涉及異常處理或者其他一些複雜的細節。基于此,可以将處理篩選邏輯的代碼放到單獨的函數中,然後使用内建的filter()函數處理。示例如下:
filter()建立了一個疊代器,是以如果我們想要的是清單形式的結果,請確定加上了list(),就像示例中那樣。
清單推導式和生成器表達式通常是用來篩選資料的最簡單和最直接的方式。此外,它們也具有同時對資料做轉換的能力。例如:
關于篩選資料,有一種情況是用新值替換掉不滿足标準的值,而不是丢棄它們。例如,除了要找到正整數之外,我們也許還希望在指定的範圍内将不滿足要求的值替換掉。通常,這可以通過将篩選條件移到一個條件表達式中來輕松實作。就像下面這樣:
另一個值得一提的篩選工具是itertools.compress(),它接受一個可疊代對象以及一個布爾選擇器序列作為輸入。輸出時,它會給出所有在相應的布爾選擇器中為true的可疊代對象元素。如果想把對一個序列的篩選結果施加到另一個相關的序列上時,這就會非常有用。例如,假設有以下兩列資料:
現在我們想建構一個位址清單,其中相應的count值要大于5。下面是我們可以嘗試的方法:
這裡的關鍵在于首先建立一個布爾序列,用來表示哪個元素可滿足我們的條件。然後compress()函數挑選出滿足布爾值為true的相應元素。
同filter()函數一樣,正常情況下compress()會傳回一個疊代器。是以,如果需要的話,得使用list()将結果轉為清單。