本節書摘來自華章社群《編寫高品質python代碼的59個有效方法》一書中的第7條:用清單推導來取代map和f?ilter,作者[美]布雷特·斯拉特金(brett slatkin),更多章節内容可以通路雲栖社群“華章社群”公衆号檢視
第7條:用清單推導來取代map和f?ilter
python提供了一種精練的寫法,可以根據一份清單來制作另外一份。這種表達式稱為list comprehension(清單推導)。例如,要用清單中每個元素的平方值建構另一份清單。如果采用清單推導來實作,那就同時指定制作新清單時所要疊代的輸入序列,以及計算新清單中每個元素的值時所用的表達式。
除非是調用隻有一個參數的函數,否則,對于簡單的情況來說,清單推導要比内置的map函數更清晰。如果使用map,那就要建立lambda函數,以便計算新清單中各個元素的值,這會使代碼看起來有些亂。
清單推導則不像map那麼複雜,它可以直接過濾原清單中的元素,使得生成的新清單不會包含對應的計算結果。例如,在計算平方值時,我們隻想計算那些可以為2所整除的數。如果采用清單推導來做,那麼隻需在循環後面添加條件表達式即可:
把内置的f?ilter函數與map結合起來,也能達成同樣的效果,但是代碼會寫得非常難懂。
字典(dict)與集(set),也有和清單類似的推導機制。編寫算法時,可以通過這些推導機制來建立衍生的資料結構。
要點
清單推導要比内置的map和f?ilter函數清晰,因為它無需額外編寫lambda表
達式。
清單推導可以跳過輸入清單中的某些元素,如果改用map來做,那就必須輔以f?ilter方能實作。
字典與集也支援推導表達式。