迭代列表不要For循環,這是Python列表推導式最基本的概念

  • 2019 年 10 月 5 日
  • 筆記

選自towardsdatascience

作者:Benedikt Droste

機器之心編譯

參與:思

如果你還在使用 For 循環迭代列表,那麼你需要了解了解列表推導式,看看它的基本概念都是什麼。

列表解析式(List comprehension)或者稱為列表推導式,是 Python 中非常強大和優雅的方法。它可以基於現有的列表做一些操作,從而快速創建新列表。在我們第一次見到列表推導式時,可能會感覺這種方法非常炫酷,因此寫列表推導式是非常爽的一件事。

如果在我們剛接觸 Python 時,列表推導式可能看起來比較複雜,但是了解後會發現它非常好用。正如上圖所示,列表推導式不僅可讀性非常強,它所需要的代碼量是最少的,它的執行速度也是最快的。

對於列表推導式,我們可以從列表中選擇具體的元素,並做一些操作和判斷,從而創建新的列表。值得注意的是,我們甚至能使用 Pandas Series 或 NumPy Array 進行列表推導操作。下面讓我們具體看看列表推導是什麼吧!

什麼是列表推導式

如果我們有一個列表,並希望抽取列表中的元素,那麼最標準的方法是使用 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 循環。我們可以發現,只要明晰了基本概念,那麼列表推導式還是非常容易使用的。

原文鏈接:https://towardsdatascience.com/python-list-comprehension-in-3-minutes-and-3-reasons-why-you-should-use-it-bf398654caf9

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。