溫馨提示×

溫馨提示×

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

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

列表解析、字典解析、集合解析的區(qū)別

發(fā)布時(shí)間:2020-09-25 09:12:33 來源:億速云 閱讀:150 作者:Leah 欄目:編程語言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)列表解析、字典解析、集合解析的區(qū)別,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、所謂解析/解析式,也稱為推導(dǎo)/推導(dǎo)式,對應(yīng)英語單詞為comprehension,是Python的一種獨(dú)有特性。解析就是從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列的結(jié)構(gòu)體,其本質(zhì)是使用一個(gè)可迭代對象,按一定規(guī)則通過表達(dá)式、函數(shù)等運(yùn)算后得到一個(gè)新的迭代對象,列表解析得到的就是列表對象,字典解析得到的是字典,集合解析得到的是集合。

二、語法釋義

1.列表解析:通過解析表達(dá)式從一個(gè)可迭代對象生成一個(gè)新的列表

[expr for iter_var in iterable]
[expr for iter_var in iterable if cond_expr]

其中:

語句中的中括號(hào)表示返回?cái)?shù)據(jù)轉(zhuǎn)換為列表。

expr為計(jì)算新列表元素值的表達(dá)式

iter_var:表示運(yùn)算表達(dá)式處理的對象所在的容器,解析就是針對在可迭代對象iter_var中的每個(gè)元素進(jìn)行表達(dá)式運(yùn)算后得到的值作為新列表的元素過程;

if cond_exp:表示可迭代對象中的元素需要滿足指定條件才會(huì)參與表達(dá)式運(yùn)算,如果需要帶多個(gè)條件,可以在if表達(dá)式后再疊加一個(gè)if表達(dá)式。如:

l=[chr(i+ord('A')) for i in range(26) if i%2==0 if i%3==0 if i%4==0 ]#結(jié)果為:['A', 'M', 'Y']

上面例子中:

ord(c)函數(shù):返回字母c的unicode碼,ASCII字符返回的就是ASCII碼

chr(i)函數(shù):返回一個(gè)unicode碼對應(yīng)的字符,0 <= i <= 0x10ffff,如果i是ASCII碼的范圍則返回ASCII字符

range是上一節(jié)介紹的函數(shù),在此用于生成一個(gè)0到25的序列迭代的range對象。

上述列表解析的語句表示:用for訪問range對象的每個(gè)元素i,當(dāng)元素i能整除2、3、4即能被12整除時(shí),就生成一個(gè)字母,該字母的ASCII碼值為'A'的ASCII碼值加上i的值,按照上述邏輯,i為0、12、 24時(shí)滿足要求,對應(yīng)的字母即為結(jié)果列表中的元素。

2.集合解析:通過解析表達(dá)式從一個(gè)可迭代對象生成一個(gè)新的集合

{expr for iter_var in iterable }
{expr for iter_var in iterable if cond_expr}

集合解析與列表解析的區(qū)別就是將列表解析的中括號(hào)換成大括號(hào),以此決定返回值是一個(gè)集合,其他的沒有什么不同。

注意:集合是會(huì)剔重的,如果出現(xiàn)重復(fù)值則只保留一個(gè)。

3.字典解析:通過解析表達(dá)式從一個(gè)可迭代對象生成一個(gè)新的字典

{key_expr:value_expr for iter_var in iterable }
{key_expr:value_expr for iter_var in iterable if cond_expr }

字典解析也是使用大括號(hào),但是必須在語句中同時(shí)指定鍵和值的計(jì)算表達(dá)式,確保生成的元素是使用冒號(hào)分隔的鍵-值對,其他的與集合解析類似。其中鍵的計(jì)算表達(dá)式為key_expr,值的計(jì)算表達(dá)式為value_expr。

注意:字典的鍵必須是唯一的,如果計(jì)算元素時(shí)出現(xiàn)鍵重合,如果出現(xiàn)重復(fù)值則只保留一個(gè)。

舉例:用一個(gè)數(shù)字列表生成數(shù)字和字母(計(jì)算方法參考上面的例子)映射關(guān)系的字典數(shù)據(jù)

d={i:chr(ord('a')+i) for i in [1,1,2,3]} ?#結(jié)果d的值為:{1: 'b', 2: 'c', 3: 'd'}
d={i:chr(ord('a')+i+index) for index,i in enumerate([1,1,2,3])}

#結(jié)果d的值為:{1: 'c', 2: 'e', 3: 'g'},enumerate函數(shù)請參考上一節(jié)的介紹

上面例子可以看到,重復(fù)的鍵1只保留了一個(gè)字典元素,該元素保留的是該鍵最后一個(gè)值對應(yīng)的鍵-值對。

三、補(bǔ)充說明

1.在生成器一節(jié)已經(jīng)介紹了生成器解析,生成器解析實(shí)際上就是生成器表達(dá)式,在此不再贅述;

2.在前面介紹時(shí)沒有提到元組解析,同時(shí)當(dāng)語句外面用小括號(hào)時(shí)實(shí)際對應(yīng)的是生成器而不是元組,因此Python并沒有元組解析這個(gè)概念,如果需要通過解析得到元組,可以通過列表解析、生成器解析方式先生成列表或生成器,再通過tuple方法將其轉(zhuǎn)換為元組;

3.雖然用語句循環(huán)賦值的方式也能實(shí)現(xiàn)上述幾種解析方法,但使用解析的方法更精簡、運(yùn)行更快;

4.解析不會(huì)改變參數(shù)中的原有迭代對象的值;

5.在解析中使用多個(gè)for語句等同于多個(gè)for循環(huán),如下面代碼實(shí)現(xiàn)了兩個(gè)列表生成第三個(gè)列表且其元素為前2個(gè)列表的笛卡爾積:

numb=[i for i in range(2)]
abc=[chr(ord('a')+k) ?for k in range(2)]
d=[(a,n) for a in abc for n in numb]

 #結(jié)果為:

[('a', 0), ('a', 1), ('b', 0), ('b', 1)]

上述就是小編為大家分享的列表解析、字典解析、集合解析的區(qū)別了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI