溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python 知識(shí)點(diǎn): 列表推導(dǎo)式(list comprehension)

發(fā)布時(shí)間:2020-08-11 02:24:53 來源:ITPUB博客 閱讀:195 作者:XIAOYUANYUAN 欄目:編程語言

Python里面有個(gè)很棒的語法糖(syntactic sugar),它就是  list comprehension  ,有人把它翻譯成“列表推導(dǎo)式”,也有人翻譯成“列表解析式”。名字聽上去很難理解,但是看它的語法就很清晰了。雖然名字叫做 list comprehension,但是這個(gè)語法同樣適用于dict、set等這一系列可迭代(iterable)數(shù)據(jù)結(jié)構(gòu)。

語法規(guī)范:

out_list = [out_express for out_express in input_list if out_express_condition]

其中的  if  條件判斷根據(jù)需要可有可無。

下面看一個(gè)具體的例子,生成一個(gè)包含10以內(nèi)的偶數(shù)的list:

In [1]: evens = [i for i in range(10) if i % 2 == 0]
In [2]: evens
Out[2]: [0, 2, 4, 6, 8]

由for循環(huán)升級(jí)到列表推導(dǎo)式:

在沒有了解 list comprehension 之前,上面那個(gè)生成偶數(shù)list的通常做法是用 for 循環(huán):

evens = []for i in range(10):    if i % 2 == 0:
        evens.append(i)

很明顯, for 循環(huán)占用了4行代碼,而  list comprehension  只用了1行代碼。

文章開始說到推導(dǎo)式的語法規(guī)范時(shí),我們講了 if 表達(dá)式是可有可無的,這也符合我們編程遇到的實(shí)際情況。比如,要生成一個(gè)10以內(nèi)的整數(shù)的平方的列表:

squares = [i**2 for i in range(10)]

復(fù)雜的嵌套循環(huán)

我們先來看一個(gè)例子,把一個(gè)矩陣(以列表為元素的列表)展平為一個(gè)列表。首先,我們用 for 循環(huán)來實(shí)現(xiàn)一下:

matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]
flattened = []for row in matrix:    for i in row:
        flattened.append(i)

接著我們用列表推導(dǎo)式實(shí)現(xiàn)該功能:

flattened = [i for row in matrix for i in row]

還是一行代碼就搞定,但一行里面有兩個(gè) for ,看起來很亂,兩個(gè) for ,哪個(gè)在前哪個(gè)在后呢? 只要記住他們的順序和不用推導(dǎo)式的原始for循環(huán)是一致的即可。

推導(dǎo)式的可讀性

一行代碼搞定幾行代碼的事情,看上去很簡潔,但是讀起來很費(fèi)勁,尤其是當(dāng)條件語句很長的時(shí)候,把這一行代碼變得很長,超過了代碼規(guī)范規(guī)定的長度(一般是80個(gè)字符),也使得理解代碼變得困難。

面對(duì)一行長長的代碼該如何下口讀,如何理解呢?別著急,好在Python允許在中括號(hào)、花括號(hào)之間斷行:

列表推導(dǎo)式的斷行:

斷行前:

evens = [i for i in range(10) if i % 2 == 0]

斷行后:

evens = [    i    for i in range(10)    if i % 2 == 0]

帶嵌套循環(huán)的推導(dǎo)式的斷行:

斷行前:

flattened = [i for row in matrix for i in row]

斷行后:

flattened = [
    i    for row in matrix    for i in row
]

字典(dict)和集合(set)的推導(dǎo)式:

前面我們也提到過,推導(dǎo)式不僅僅適用于列表,它同樣使用于字典dict和集合set。

把一個(gè)字典的key和value互換:

changed = {value: key for key, value in input_dict.items()}

用一個(gè)列表的所有單詞的首字母生成一個(gè)集合:

chars = {w[0] for w in words_list}

通過以上講解就可以輕松掌握Python的列表推導(dǎo)式( list comprehension )了,簡而言之, 就是把普通的多行for循環(huán)壓縮成一行代碼,這種壓縮語法適用于列表、字典、集合等可迭代數(shù)據(jù)結(jié)構(gòu)(iterables)。


在這里跟大家一起分享Python知識(shí),一方面我自已也在寫一個(gè) Python教程 的博客: 猿人學(xué) 和公從號(hào)猿人學(xué)Python,從Python基礎(chǔ)教程到 Python技術(shù)雜談 ,和一些利用 Python爬蟲掙錢的思路 ,都在我的個(gè)人博客中首發(fā),興趣的朋友可以關(guān)注一下。



向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI