【Python基礎(chǔ)】Python列表生成式
編譯 |VK
來(lái)源 | Towards Data Science

列表生成式是一種基于其他iterable(如集合、元組、其他列表等)創(chuàng)建列表的方法。它還可以用更簡(jiǎn)單、更吸引人的語(yǔ)法表示for和if循環(huán)。不過(guò),列表生成式比f(wàn)or循環(huán)要快得多。
列表生成式的基本結(jié)構(gòu)如下。

這看起來(lái)很簡(jiǎn)單,但在某些情況下可能會(huì)變得棘手。在本文中,我們將從一個(gè)非常簡(jiǎn)單的列表生成式開(kāi)始,并逐步增加復(fù)雜性。我將清楚地解釋如何表示和生成式高度復(fù)雜的列表生成式。
在大多數(shù)情況下,列表生成式優(yōu)先于for和if循環(huán),因?yàn)?/span>
它們比f(wàn)or循環(huán)快得多。 它們被認(rèn)為比循環(huán)和映射函數(shù)更具python特性。 列表生成式的語(yǔ)法更容易閱讀。
讓我們從一個(gè)簡(jiǎn)單的例子開(kāi)始。
words = ['data','science','machine','learning']
我們要?jiǎng)?chuàng)建一個(gè)列表,其中包含單詞列表中每個(gè)單詞的長(zhǎng)度。讓我們使用for循環(huán)和列表生成式來(lái)執(zhí)行任務(wù)。
# for循環(huán)
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]
生成式列表語(yǔ)法的最佳方法是比較for和if循環(huán)。下圖演示了比較。

for循環(huán)末尾的表達(dá)式放在列表的開(kāi)頭。
當(dāng)我們復(fù)習(xí)這些例子時(shí),會(huì)更清楚。讓我們創(chuàng)建一個(gè)列表,其中包含單詞列表中長(zhǎng)度大于5的項(xiàng)。
# for循環(huán)
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']
下圖顯示了如何在列表中表示循環(huán)中的表達(dá)式。

與上一個(gè)示例一樣,在for循環(huán)末尾所做的事情被放在列表的開(kāi)頭。在這種情況下,我們按原樣處理項(xiàng)。列表生成式的下一部分是循環(huán)中的第一個(gè)表達(dá)式,然后是循環(huán)中的第二個(gè)表達(dá)式。
循環(huán)中的邏輯更直觀。因此,與循環(huán)相比,列表生成式的結(jié)構(gòu)相對(duì)容易掌握。過(guò)一段時(shí)間,你就不必做一個(gè)明確的比較,因?yàn)槟愕拇竽X已經(jīng)習(xí)慣了。
下一個(gè)例子稍微復(fù)雜一些。我們要?jiǎng)?chuàng)建一個(gè)包含單詞列表項(xiàng)中所有“a”、“e”和“i”字母的列表。此任務(wù)涉及嵌套的for和if循環(huán)。
# for循環(huán)
a = []
for word in words:
for letter in word:
if letter in ["a","e","i"]:
a.append(letter)
讓我們?cè)敿?xì)說(shuō)明一下語(yǔ)法。我們反復(fù)瀏覽單詞表。對(duì)于每個(gè)項(xiàng),我們遍歷字符。如果一個(gè)字符符合給定的條件,它將被附加到列表a中。
完成相同任務(wù)的列表生成式如下。
b = [letter for word in words for letter in word if letter in ["a","e","i"]]
我們從for循環(huán)中的最后一個(gè)表達(dá)式開(kāi)始生成式列表。剩下的部分從循環(huán)的開(kāi)頭開(kāi)始。下圖說(shuō)明了每個(gè)步驟。

結(jié)論
列表生成式是一種高效的操作。對(duì)于簡(jiǎn)單的任務(wù),生成式的語(yǔ)法很容易,在復(fù)雜的情況下可能會(huì)變得棘手。
如果你很難創(chuàng)建或生成式復(fù)雜的列表生成式,請(qǐng)嘗試使用循環(huán)編寫。
需要注意的是,列表生成式并不總是最佳選擇。它們將整個(gè)輸出列表加載到內(nèi)存中。這對(duì)于中小型列表是可以接受的,甚至是可取的,因?yàn)樗共僮鞲臁?/span>
然而,當(dāng)我們處理大型列表(例如10億個(gè)元素)時(shí),應(yīng)該避免列表生成式。它可能會(huì)導(dǎo)致你的計(jì)算機(jī)崩潰,由于內(nèi)存需求量過(guò)大。
對(duì)于這樣大的列表,一個(gè)更好的選擇是使用一個(gè)生成器,它實(shí)際上不會(huì)在內(nèi)存中創(chuàng)建一個(gè)大的數(shù)據(jù)結(jié)構(gòu)。生成器在使用項(xiàng)時(shí)創(chuàng)建它們。用完后,生成器會(huì)將它們?nèi)拥簟I善鞑粫?huì)導(dǎo)致內(nèi)存問(wèn)題,但它們比列表生成式相對(duì)較慢。
謝謝你的閱讀。
往期精彩回顧
本站qq群851320808,加入微信群請(qǐng)掃碼:
