不容錯過!Python列表推導式簡明教程
列表解析式(List comprehension)或者稱為列表推導式,是 Python 中非常強大和優雅的方法。它可以基于現有的列表做一些操作,從而快速創建新列表。在我們第一次見到列表推導式時,可能會感覺這種方法非常炫酷,因此寫列表推導式是非常爽的一件事。
什么是列表推導式
如果我們有一個列表,并希望抽取列表中的元素,那么最標準的方法是使用 Python 循環,但是我們也可以直接通過列表推導式,它只需一行代碼就能搞定所有操作。當然,抽取列表元素的前提是,我們要理解列表是一種可迭代對象,它允許依次讀取不同的元素。
想象一下,如果動物園中有很多不同的動物,每年每一只動物都需要定期體檢,那么動物園就是列表。我們可以遍歷整個動物園,并依次抽取動物,抽取的動物并不做進一步的處理,直接放到體檢列表中。如下所示為一般 Python 循環的做法:
- # Creating our animal park
- animal_park = [ Rabbit , Rabbit , Rabbit , Rabbit , Cat , Cat , Cat , Cat , Cat , Cat , Cat , Turtle , Turtle , Turtle , Turtle , Turtle , Turtle , Turtle , Dog , Dog , Kangaroo , Kangaroo , Kangaroo , Kangaroo , Kangaroo , Kangaroo ]
- # Creating a new list for our animal doctor with all animals
- animal_doctor = []
- for animal in animal_park:
- animal_doctor.append(animal)
上面的代碼很簡單,用一個 for 循環就行,它的語義也很容易理解。如下我們可以使用列表推導式重寫這一個循環:
- animal_doctor = [animal for animal in animal_park]
通過列表推導式,我們將代碼量由三行降低到一行。如果對比兩者,我們會發現它們其實是一樣的,差不多都是創建、遍歷和接收三部分。
圖1:標準循環與列表推導的對比。
條件語句
這樣看起來列表推導式也沒什么大不了,但別忘了它還能對元素做進一步操作,例如加個條件語句。在標準的列表循環中,我們的條件語句如下所示會加到 for 循環中。
- animal_doctor = []
- for animal in animal_park:
- if animal != Dog and animal != Cat :
- animal_doctor.append(animal)
在列表推導式中,我們可以將條件加到里面,用稍微長一點的單行代碼完成整個流程。上面代碼塊可以等價地表達為:
- nimal_doctor = [animal for animal in animal_park if animal != Dog and animal != Cat ]
另外非常重要的一點是,列表推導式的速度非常快。如下兩者都加了條件語句,但是列表推導式要比一般的循環語句快了 51%。
圖2:列表推導與標準循環二者速度的對比。
最后,如果你使用過列表推導式創建新的列表,那么你最好一直使用它,因為我們沒有原因再使用標準 Python 循環。我們可以發現,只要明晰了基本概念,那么列表推導式還是非常容易使用的。