Python里面有個(gè)很棒的語(yǔ)法糖(syntactic sugar),它就是
list comprehension
,有人把它翻譯成“列表推導(dǎo)式”,也有人翻譯成“列表解析式”。名字聽上去很難理解,但是看它的語(yǔ)法就很清晰了。雖然名字叫做 list comprehension,但是這個(gè)語(yǔ)法同樣適用于dict、set等這一系列可迭代(iterable)數(shù)據(jù)結(jié)構(gòu)。
在興海等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,全網(wǎng)整合營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,興海網(wǎng)站建設(shè)費(fèi)用合理。
out_list = [out_express for out_express in input_list if out_express_condition]
其中的
if
條件判斷根據(jù)需要可有可無(wú)。
下面看一個(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]
在沒有了解
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行代碼。
文章開始說(shuō)到推導(dǎo)式的語(yǔ)法規(guī)范時(shí),我們講了
if
表達(dá)式是可有可無(wú)的,這也符合我們編程遇到的實(shí)際情況。比如,要生成一個(gè)10以內(nèi)的整數(shù)的平方的列表:
squares = [i**2 for i in range(10)]
我們先來(lái)看一個(gè)例子,把一個(gè)矩陣(以列表為元素的列表)展平為一個(gè)列表。首先,我們用
for
循環(huán)來(lái)實(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
,看起來(lái)很亂,兩個(gè)
for
,哪個(gè)在前哪個(gè)在后呢?
只要記住他們的順序和不用推導(dǎo)式的原始for循環(huán)是一致的即可。
一行代碼搞定幾行代碼的事情,看上去很簡(jiǎn)潔,但是讀起來(lái)很費(fèi)勁,尤其是當(dāng)條件語(yǔ)句很長(zhǎng)的時(shí)候,把這一行代碼變得很長(zhǎng),超過了代碼規(guī)范規(guī)定的長(zhǎng)度(一般是80個(gè)字符),也使得理解代碼變得困難。
面對(duì)一行長(zhǎng)長(zhǎng)的代碼該如何下口讀,如何理解呢?別著急,好在Python允許在中括號(hào)、花括號(hào)之間斷行:
斷行前:
evens = [i for i in range(10) if i % 2 == 0]
斷行后:
evens = [ i for i in range(10) if i % 2 == 0]
斷行前:
flattened = [i for row in matrix for i in row]
斷行后:
flattened = [ i for row in matrix for i in row ]
前面我們也提到過,推導(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
)了,簡(jiǎn)而言之,
就是把普通的多行for循環(huán)壓縮成一行代碼,這種壓縮語(yǔ)法適用于列表、字典、集合等可迭代數(shù)據(jù)結(jié)構(gòu)(iterables)。
在這里跟大家一起分享Python知識(shí),一方面我自已也在寫一個(gè) Python教程 的博客: 猿人學(xué) 和公從號(hào)猿人學(xué)Python,從Python基礎(chǔ)教程到 Python技術(shù)雜談 ,和一些利用 Python爬蟲掙錢的思路 ,都在我的個(gè)人博客中首發(fā),興趣的朋友可以關(guān)注一下。