列表生成式,指在列表中,按照一定規則,快速生成列表元素的方式。
接下來,我們舉幾個例子,看下普通的列表生成與使用列表生成式在書寫及性能上有何區別。
1、生成一個包含10000000個元素的列表
-
普通實現
import time start_time = time.time() data = [] for i in range(10000*1000): data.append(i) end_time = time.time() print('用時:%s'%(end_time-start_time))
結果:
-
列表生成式
import time start_time = time.time() data = [i for i in range(10000000)] #列表生成式 end_time = time.time() print('用時:%s'%(end_time-start_time))
結果:
分析:- 普通模式使用三行代碼,列表生成式僅用一行,列表生成式更爲簡潔優雅。
- 由運行所用時長可看出,列表生成式速度更快,效率更高。
- 列表生成式,前面爲表達式,後面爲for循環
2、求0~100之間的所有奇數
思路:
step1、循環0~100
step2、用模運算判斷是否是奇數
-
普通實現
result = [] for i in range(100): if i % 2 != 0: result.append(i)
-
列表生成式
result = [i for i in range(100) if i % 2 != 0]
分析:
- 列表生成式同樣是一行代碼搞定,十分簡潔
- for循環後可以通過if進行元素篩選
3、元素篩選及處理
上面兩個例子很簡單,當然,列表生成式的功能遠不止於此。下面,我們完成一些稍微複雜的需求。
-
求0~100的所有奇數的平方
實例2的變種,做個小修改即可。result = [i*i for i in range(100) if i % 2 != 0]
-
將所給字符串列表的所有小寫元素改爲大寫,大寫改爲小寫
step1、循環列表
step2、判斷是否是大寫元素,s.lower()!=ss = ['jc','YF','xbz'] result = [i.lower() if i.lower()!=i else i.upper() for i in s] print(result)
結果:
['JC', 'yf', 'XBZ']
-
將所給列表的元素、下標對應組成字典
注:列表需爲字符串列表s = ['jc','dbz','yf','xdg'] result = [{value:index} for index,value in enumerate(s)]
結果:
[{'jc': 0}, {'dbz': 1}, {'yf': 2}, {'xdg': 3}]
4、錯誤語法示範
#if在for循環後,加else報錯
result = [i for i in range(100) if i % 2 != 0 else]
#表達式執行多行語句
result = [i+=1;i*i for i in range(100)]
報錯:
5、總結
1、列表生成式能大幅度簡化代碼、使其更爲簡潔優雅
2、能有效提高代碼效率
3、可對列表元素進行篩選處理
(1)單個條件判斷,if寫在for循環後,後面不能跟else
(2)if…else判斷寫在for循環之前
4、元素表達式只能進行單語句操作
參考文章:
[1] 列表生成式-廖雪峯的官方網站