列表推導式(又稱列表解析式)提供了一種簡明扼要的方法來創建列表。
它的結構是在一個中括號里包含一個表達式,然后是一個for語句,然后是 0 個或多個 for 或者 if 語句。那個表達式可以是任意的,意思是你可以在列表中放入任意類型的對象。返回結果將是一個新的列表,在這個以 if 和 for 語句為上下文的表達式運行完成之后產生。
列表推導式的執行順序:各語句之間是嵌套關系,左邊第二個語句是最外層,依次往右進一層,左邊第一條語句是最后一層。
下面看一個具體的例子:
實例1:求10以內每個數字的平方值,保存到列表中
以往,我們會用for循環來實現:
1 list1 = [] 2 for x in range(10): 3 list1.append(x**2)
如果用列表推導式,如下:
1 list1 = [x ** 2 for x in range(10)]
只用一行代碼,就搞定。
實例3:復雜的循環嵌套
把一個矩陣(以列表為元素的列表)展平為一個列表。首先,我們用for
循環來實現一下:
1 matrix = [ 2 [1, 2, 3], 3 [4, 5, 6], 4 [7, 8, 9], 5 ] 6 7 # 方法1:用for循環來處理 8 mylist_1 = [] 9 for i in matrix: 10 for j in i: 11 mylist_1.append(j) 12 print(mylist_1) #[1, 2, 3, 4, 5, 6, 7, 8, 9]
接下來,我們用列表推導式實現:
1 mylist_2 = [j for i in matrix for j in i] 2 print(mylist_2) #[1, 2, 3, 4, 5, 6, 7, 8, 9]
還是一行代碼就搞定,但一行里面有兩個for
,看起來很亂,兩個for
,哪個在前哪個在后呢?只要記住他們的順序和不用推導式的原始for循環是一致的即可。
列表推導式的可讀性:
一行代碼搞定幾行代碼的事情,看上去很簡潔,但是讀起來很費勁,尤其是當條件語句很長的時候,把這一行代碼變得很長,超過了代碼規范規定的長度(一般是80個字符),也使得理解代碼變得困難。
面對一行長長的代碼該如何下口讀,如何理解呢?別着急,好在Python允許在中括號、花括號之間斷行:
列表推導式斷行:
斷行前:
1 mylist_2 = [j for i in matrix for j in i]
斷行后:
1 mylist_2 = [ 2 j 3 for i in matrix 4 for j in i 5 ]
字典(dict)和集合(set)的推導式:
前面我們也提到過,推導式不僅僅適用於列表,它同樣使用於字典dict和集合set。
把一個字典的key和value互換:
changed = {value: key for key, value in input_dict.items()}
用一個列表的所有單詞的首字母生成一個集合:
chars = {w[0] for w in words_list}
通過以上講解就可以輕松掌握Python的列表推導式(list comprehension
)了,簡而言之,就是把普通的多行for循環壓縮成一行代碼,這種壓縮語法適用於列表、字典、集合等可迭代數據結構(iterables)。