您可能聽說過Python的列表理解。也許這甚至是你在沒有真正理解的情況下使用的東西。現在是學習的時候了,因為我們將介紹有關Python中列表理解的所有知識。
在開始之前,有必要讓自己重新瞭解數組和列表在Python中是如何工作的,以及如何使用Python字典。
列表理解聽起來很複雜,但實際上並不複雜。在Python中,它只是一種根據某些條件快速篩選或細化列表的方法。
它省去了你寫幾行代碼的時間(特別是當你已經在一個循環中的時候),而且它保持了你代碼的可讀性。
但是,要小心,因為列表理解並不總是答案。很容易忘乎所以,寫出難以理解的複雜理解。有時寫更多的代碼更好,尤其是如果它有助於可讀性的話。堅持簡單的任務,把代碼放在一個單一的職責上。
注意:這些示例都使用python3.6。如果您不確定python3和python2之間的區別,那麼請務必閱讀我們的Python常見問題解答,我們將在這裡討論這個問題以及更多內容。
考慮複製數組並將數組中的每個字母轉換為大寫的這段代碼。它通過循環數組中的每個項來實現:
letters = ['a', 'b', 'c', 'd']print(letters)upper_letters = []for letter in letters: result = letter.upper() upper_letters.append(result)print(upper_letters)下面是相同的邏輯,除了使用基本的Python列表理解在一行代碼中完成之外:
letters = ['a', 'b', 'c', 'd']print(letters)upper_letters = [x.upper() for x in letters]print(upper_letters)如您所見,結果是完全相同的,但是這個過程需要大量的代碼而不需要列表理解。
讓我們把這個簡單的例子分解一下。
本例創建了一個名為letters的列表。它存儲小寫字母“a”、“b”、“c”和“d”。假設您希望所有這些列表元素都是大寫的?在沒有列表理解的情況下,您必須創建一個新的列表來存儲結果(稱為大寫字母),循環遍歷字母列表中的每個元素,轉換每個字母(並將其存儲在結果中——可選但良好的做法),然後將大寫字母附加到新列表中。多大的工作量啊!
這裡的列表理解幾乎完全等同於循環選項。它實際上表示“對於字母列表中的每個字母,將它們轉換為大寫,並將結果作為新列表返回。”
列表理解只能用於列表,並且必須返回新列表。我們再深入一點。
一份理解清單包括三個部分(我們將在下面介紹第三部分)。列表理解必須以方括號([和])開始和結束。這就是它的設計方式,讓Python知道您將使用一個列表。
在方括號內,您需要從結果開始。這就是您希望對每個列表元素執行的操作。
在上面的示例中,下面的代碼使用upper()方法將每個元素(由變量名x引用)轉換為大寫,upper()方法是Python核心庫的一部分:
[x.upper() # will not run, only half the comprehension at this point接下來,您需要告訴Python要處理哪個列表,並將每個元素分配給一個變量。這與冗長示例中的for循環完全相同:
for x in letters每次循環遍歷列表時,x的值都將更改為當前元素的值。它將以“a”開頭,然後是“b”,依此類推。
如果你把它們放在一起(並把它賦給一個名為upper\u letters的變量),你就完成了:
upper_letters = [x.upper() for x in letters]現在,大寫字母將包含一個大寫字母列表,從“a”開始,然後是“B”,依此類推。
正如我們上面提到的,還有第三部分要列出理解。
完成上述兩個步驟後,可以包括一個可選條件。這就像使用if語句說“基於這個舊列表,為我創建一個新列表,但只包含符合我的條件的元素”。
下面是它的樣子:
ages = [1, 34, 5, 7, 3, 57, 356]print(ages)old_ages = [x for x in ages if x > 10]print(old_ages)本例使用了一個名為ages的新列表。舊錶是用一個表集合起來的。末尾的if條件意味著只有滿足條件的列表元素才會**到新列表中。在這個例子中,任何年齡大於10歲都是允許的。
一旦你掌握了竅門,列表理解是驚人的,但它並不是在任何情況下都有用。當您需要多個條件時,您可能不應該使用它:
old_ages = [x for x in ages if x > 10 and x < 100 and x is not None]這個代碼可以工作,但它開始變得冗長和混亂。類似地,除了一個簡單的函數調用以外的任何東西都可能不起作用。在本例中,您將得到一個錯誤:
letters = ['a', 'b', 'c', 'd', 2]print(letters)upper_letters = [x.upper() for x in letters]print(upper_letters)這是一個非常有效的代碼,但由於不能將數字大寫,因此無法使用。在這種情況下,較長的循環實際上更可取,因為您可以執行一些異常處理:
letters = ['a', 'b', 'c', 'd', 1]print(letters)upper_letters = []for letter in letters: try: result = letter.upper() upper_letters.append(result) except AttributeError: pass # do nothingprint(upper_letters)既然您知道Python中的列表理解是多麼容易,就沒有理由不使用它了。只需記住保持簡單,並首先考慮可讀性。
也許你會用Python控制Arduino,或者DIY Python網絡安全攝像頭呢?
...幾個與列表相關聯的內建函式。程式設計師可以在程式中使用它們。其中兩個是,append和extend。本文討論了append和extend的區別巨蟒append方法主要用於向現有列表中新增一個元素,而extend方法用於向現有列表中新增多個元素。Python...
...設計有助於將程式劃分為函式。面向物件程式設計有助於使用物件對軟體或程式進行建模。 Perl是一種解釋語言。因此,每一行都由直譯器逐個讀取。高階語言程式可以被程式設計師理解,但機器卻不能理解。因此,指令應轉換...
...是這些語言支援面向物件程式設計(OOP)。OOP方法有助於使用物件對一個或一組程式進行建模。Ruby和Python的關鍵區別在於Ruby主要用於web開發,而Python主要用於各種應用程式,包括web開發。Python還常用於科學計算、資料科學應用...
...式語言和一個用於統計分析的軟體環境,用於表示圖形。使用R的主要優點是它可以用於實現統計概念,如線性和非線性建模、時間序列分析、聚類等。 R是一種解釋語言,因此每一行都由直譯器一行接一行地讀。它是一種高階程...
... 然而,如果你不知道如何使用它,你可能會生氣。如果您不知道在程式碼中的什麼地方應用它,那就更令人沮喪了。在這裡,我們將透過一些實際例子向您展示如何在Python中使用列表理解。 ...
...資料型別告訴編譯器(或者在Python的情況下告訴直譯器)如何使用資料。資料結構指定可以執行的操作,並且通常實現特定的規則和規定。 ...
有沒有想過如何在兩種程式語言之間傳送資料?是否嘗試傳送一個物件或多個數據段? ...