Python3 之 列表推導式


列表推導式(又稱列表解析式)提供了一種簡明扼要的方法來創建列表。

它的結構是在一個中括號里包含一個表達式,然后是一個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)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM