【Python基础】Python列表生成式
作者 | Soner Y?ld?r?m
編譯? |VK
來源 | Towards Data Science
列表生成式是一種基于其他iterable(如集合、元組、其他列表等)創建列表的方法。它還可以用更簡單、更吸引人的語法表示for和if循環。不過,列表生成式比for循環要快得多。
列表生成式的基本結構如下。
這看起來很簡單,但在某些情況下可能會變得棘手。在本文中,我們將從一個非常簡單的列表生成式開始,并逐步增加復雜性。我將清楚地解釋如何表示和生成式高度復雜的列表生成式。
在大多數情況下,列表生成式優先于for和if循環,因為
它們比for循環快得多。
它們被認為比循環和映射函數更具python特性。
列表生成式的語法更容易閱讀。
讓我們從一個簡單的例子開始。
words?=?['data','science','machine','learning']我們要創建一個列表,其中包含單詞列表中每個單詞的長度。讓我們使用for循環和列表生成式來執行任務。
#?for循環 a?=?[] for?word?in?words:a.append(len(word))#?列表生成式 b?=?[len(word)?for?word?in?words]print(f"a?is?{a}") print(f"b?is?{b}")a?is?[4,?7,?7,?8] b?is?[4,?7,?7,?8]生成式列表語法的最佳方法是比較for和if循環。下圖演示了比較。
for循環末尾的表達式放在列表的開頭。
當我們復習這些例子時,會更清楚。讓我們創建一個列表,其中包含單詞列表中長度大于5的項。
#?for循環 a?=?[] for?word?in?words:if?len(word)?>?5:a.append(word)#?列表生成式 b?=?[word?for?word?in?words?if?len(word)?>?5]print(f"a?is?{a}") print(f"b?is?{b}")a?is?['science',?'machine',?'learning'] b?is?['science',?'machine',?'learning']下圖顯示了如何在列表中表示循環中的表達式。
與上一個示例一樣,在for循環末尾所做的事情被放在列表的開頭。在這種情況下,我們按原樣處理項。列表生成式的下一部分是循環中的第一個表達式,然后是循環中的第二個表達式。
循環中的邏輯更直觀。因此,與循環相比,列表生成式的結構相對容易掌握。過一段時間,你就不必做一個明確的比較,因為你的大腦已經習慣了。
下一個例子稍微復雜一些。我們要創建一個包含單詞列表項中所有“a”、“e”和“i”字母的列表。此任務涉及嵌套的for和if循環。
#?for循環 a?=?[] for?word?in?words:for?letter?in?word:if?letter?in?["a","e","i"]:a.append(letter)讓我們詳細說明一下語法。我們反復瀏覽單詞表。對于每個項,我們遍歷字符。如果一個字符符合給定的條件,它將被附加到列表a中。
完成相同任務的列表生成式如下。
b?=?[letter?for?word?in?words?for?letter?in?word?if?letter?in?["a","e","i"]]我們從for循環中的最后一個表達式開始生成式列表。剩下的部分從循環的開頭開始。下圖說明了每個步驟。
結論
列表生成式是一種高效的操作。對于簡單的任務,生成式的語法很容易,在復雜的情況下可能會變得棘手。
如果你很難創建或生成式復雜的列表生成式,請嘗試使用循環編寫。
需要注意的是,列表生成式并不總是最佳選擇。它們將整個輸出列表加載到內存中。這對于中小型列表是可以接受的,甚至是可取的,因為它使操作更快。
然而,當我們處理大型列表(例如10億個元素)時,應該避免列表生成式。它可能會導致你的計算機崩潰,由于內存需求量過大。
對于這樣大的列表,一個更好的選擇是使用一個生成器,它實際上不會在內存中創建一個大的數據結構。生成器在使用項時創建它們。用完后,生成器會將它們扔掉。生成器不會導致內存問題,但它們比列表生成式相對較慢。
謝謝你的閱讀。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python基础】Python列表生成式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win11任务栏如何设置在顶部
- 下一篇: 【Python基础】入门Pandas不可