【Python】Python 過濾列表


如你所知,Python 具有通過列表解析將列表映射到其它列表的強大能力。這種能力同過濾機制結合使用,使列表中的有些元素被映射的同時跳過另外一些元素。
過濾列表語法:

[mapping-expression for element in source-list if filter-expression]

這是你所知所愛的列表解析的擴展。前三部分都是相同的;最后一部分,以 if 開頭的是過濾器表達式。過濾器表達式可以是返回值為真或者假的任何表達式 (在 Python 中是幾乎任何東西)。任何經過濾器表達式演算值為真的元素都可以包含在映射中。其它的元素都將忽略,它們不會進入映射表達式,更不會包含在輸出列表中。

 

1. 列表過濾介紹

1 >>> li = ["a", "mpilgrim", "foo", "b", "c", "b", "d", "d"]  
2 >>> [elem for elem in li if len(elem) > 1]       (1)  
3 ['mpilgrim', 'foo']  
4 >>> [elem for elem in li if elem != "b"]         (2)  
5 ['a', 'mpilgrim', 'foo', 'c', 'd', 'd']  
6 >>> [elem for elem in li if li.count(elem) == 1] (3)  
7 ['a', 'mpilgrim', 'foo', 'c']  

(1)  這里的映射表達式很簡單 (只是返回每個元素的值),所以請把注意力集中到過濾器表達式上。由於 Python 會遍歷整個列表,它將對每個元素執行過濾器表達式。如果過濾器表達式演算值為真,該元素就會被映射,同時
映射表達式的結果將包含在返回的列表中。這里,你過濾掉了所有單字符的字符串,留下了一個由長字符串構成的列表。
(2)  這里你過濾掉了一個特定值 b。注意這個過濾器會過濾掉所有的 b,因為每次取出 b,過濾表達式都將為假。
(3)  count 是一個列表方法,返回某個值在列表中出現的次數。你可以認為這個過濾器將從列表中剔除重復元素,返回一個只包含了在原始列表中有着唯一值拷貝的列表。但並非如此,因為在原始列表中出現兩次的值 (在本

例中,b 和 d) 被完全剔除了。從一個列表中排除重復值有多種方法,但過濾並不是其中的一種。

 

回到 apihelper.py 中的這一行:

methodList = [method for method in dir(object) if callable(getattr(object, method))]  

這行看上去挺復雜――確實也很復雜――但是基本結構都還是一樣的。整個過濾表達式返回一個列表,並賦值給 methodList 變量。表達式的前半部分是列表映射部分。映射表達式是一個和遍歷元素相同的表達式,因此它返回每個元素的值。dir(object) 返回 object 對象的屬性和方法列表――你正在映射的列表。所以唯一新出現的部分就是在 if 后面的過濾表達式。
過濾表達式看上去很恐怖,其實不是。你已經知道了 callable、getattr 和 in。正如你在前面的部分中看到的,如果 object 是一個模塊,並且 method 是上述模塊中某個函數的名稱,那么表達式 getattr(object, method) 將返回一個函數對象。
所以這個表達式接收一個名為 object 的對象,然后得到它的屬性、方法、函數和其他成員的名稱列表,接着過濾掉我們不關心的成員。執行過濾行為是通過對每個屬性/方法/函數的名稱調用 getattr 函數取得實際成員的引用,然后檢查這些成員對象是否是可調用的,當然這些可調用的成員對象可能是方法或者函數,同時也可能是內置的 (比如列表的 pop 方法) 或者用戶自定義的 (比如 odbchelper 模塊的 buildConnectionString 函數)。這里你不用關心其它的屬性,如內置在每一個模塊中的 __name__ 屬性。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM