您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關列表解析、字典解析、集合解析的區別,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
一、所謂解析/解析式,也稱為推導/推導式,對應英語單詞為comprehension,是Python的一種獨有特性。解析就是從一個數據序列構建另一個新的數據序列的結構體,其本質是使用一個可迭代對象,按一定規則通過表達式、函數等運算后得到一個新的迭代對象,列表解析得到的就是列表對象,字典解析得到的是字典,集合解析得到的是集合。
二、語法釋義
1.列表解析:通過解析表達式從一個可迭代對象生成一個新的列表
[expr for iter_var in iterable] [expr for iter_var in iterable if cond_expr]
其中:
語句中的中括號表示返回數據轉換為列表。
expr為計算新列表元素值的表達式
iter_var:表示運算表達式處理的對象所在的容器,解析就是針對在可迭代對象iter_var中的每個元素進行表達式運算后得到的值作為新列表的元素過程;
if cond_exp:表示可迭代對象中的元素需要滿足指定條件才會參與表達式運算,如果需要帶多個條件,可以在if表達式后再疊加一個if表達式。如:
l=[chr(i+ord('A')) for i in range(26) if i%2==0 if i%3==0 if i%4==0 ]#結果為:['A', 'M', 'Y']
上面例子中:
ord(c)函數:返回字母c的unicode碼,ASCII字符返回的就是ASCII碼
chr(i)函數:返回一個unicode碼對應的字符,0 <= i <= 0x10ffff,如果i是ASCII碼的范圍則返回ASCII字符
range是上一節介紹的函數,在此用于生成一個0到25的序列迭代的range對象。
上述列表解析的語句表示:用for訪問range對象的每個元素i,當元素i能整除2、3、4即能被12整除時,就生成一個字母,該字母的ASCII碼值為'A'的ASCII碼值加上i的值,按照上述邏輯,i為0、12、 24時滿足要求,對應的字母即為結果列表中的元素。
2.集合解析:通過解析表達式從一個可迭代對象生成一個新的集合
{expr for iter_var in iterable } {expr for iter_var in iterable if cond_expr}
集合解析與列表解析的區別就是將列表解析的中括號換成大括號,以此決定返回值是一個集合,其他的沒有什么不同。
注意:集合是會剔重的,如果出現重復值則只保留一個。
3.字典解析:通過解析表達式從一個可迭代對象生成一個新的字典
{key_expr:value_expr for iter_var in iterable } {key_expr:value_expr for iter_var in iterable if cond_expr }
字典解析也是使用大括號,但是必須在語句中同時指定鍵和值的計算表達式,確保生成的元素是使用冒號分隔的鍵-值對,其他的與集合解析類似。其中鍵的計算表達式為key_expr,值的計算表達式為value_expr。
注意:字典的鍵必須是唯一的,如果計算元素時出現鍵重合,如果出現重復值則只保留一個。
舉例:用一個數字列表生成數字和字母(計算方法參考上面的例子)映射關系的字典數據
d={i:chr(ord('a')+i) for i in [1,1,2,3]} ?#結果d的值為:{1: 'b', 2: 'c', 3: 'd'} d={i:chr(ord('a')+i+index) for index,i in enumerate([1,1,2,3])}
#結果d的值為:{1: 'c', 2: 'e', 3: 'g'},enumerate函數請參考上一節的介紹
上面例子可以看到,重復的鍵1只保留了一個字典元素,該元素保留的是該鍵最后一個值對應的鍵-值對。
三、補充說明
1.在生成器一節已經介紹了生成器解析,生成器解析實際上就是生成器表達式,在此不再贅述;
2.在前面介紹時沒有提到元組解析,同時當語句外面用小括號時實際對應的是生成器而不是元組,因此Python并沒有元組解析這個概念,如果需要通過解析得到元組,可以通過列表解析、生成器解析方式先生成列表或生成器,再通過tuple方法將其轉換為元組;
3.雖然用語句循環賦值的方式也能實現上述幾種解析方法,但使用解析的方法更精簡、運行更快;
4.解析不會改變參數中的原有迭代對象的值;
5.在解析中使用多個for語句等同于多個for循環,如下面代碼實現了兩個列表生成第三個列表且其元素為前2個列表的笛卡爾積:
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]
#結果為:
[('a', 0), ('a', 1), ('b', 0), ('b', 1)]
上述就是小編為大家分享的列表解析、字典解析、集合解析的區別了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。