for循環用膩了,試試列表生成式。
- 2019 年 10 月 10 日
- 筆記
在編寫程式或者查看別人的程式時,經常會遇到列表生成式,這個使用起來並不複雜,但是非常有用,使我們的程式碼更加簡潔靈活。很多python使用者並不太會使用它。今天,就給大家詳細講解列表生成式和生成器表達式的使用
一、列表生成式
優點:一行程式碼幾乎可以搞定所需要的任何列表
缺點:容易著迷,不易排錯,不能超過三個循環
- 用列表推導式能構建的任何列表,用別的都可以構建,比如for循環
- 列表推導式,最多不超過3個for循環。判斷只能用一個
1. 循環模式:模板:[經過加工的i for i in 可迭代對象]
使用for循環方法
li = [] for i in range(1,4): li.append('還珠格格第'+str(i)+'部') print(li) #['還珠格格第1部', '還珠格格第2部', '還珠格格第3部']
第二種寫法
li = [] for i in range(1,4): li.append('還珠格格第%s部' % i) print(li)
上面的程式碼,可以一行搞定。用列表推導式就可以了
li = ['還珠格格第%s部' %i for i in range(1,4)] print(li) li = ['還珠格格第{}部'.format(i) for i in range(1,4)] # 上下結果相同 print(li)
例:求1~10平方結果
li = [i ** 2 for i in range(1,11)] print(li)
執行輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
2. 篩選模式:[經過加工的i for i in 可迭代對象 if 條件 篩選]
30以內所有能被3整除的數
l3 = [i for i in range(1,31) if i % 3 == 0] print(l3) # [3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
30以內所有能被3整除的數的平方
li = [i**2 for i in range(1,31) if i % 3 == 0] print(li) # [9, 36, 81, 144, 225, 324, 441, 576, 729, 900]
找到嵌套列表中名字含有兩個'e'的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry']] l4 = [name for i in names for name in i if name.count('e') == 2 ] print(l4) # ['Jefferson', 'Wesley', 'Steven', 'Jennifer']
常用的是列表推導式
字典推導式
將一個字典的key和value對調
dict = {'a': 10, 'b': 34} dict_frequency = {dict[k]: k for k in mcase} print(dict_frequency)
執行輸出:{10: 'a', 34: 'b'}
相當於
dict = {'a': 10, 'b': 34} dict_frequency = {} for k in dict: dict_frequency[k]=dict[k] print(dict_frequency)
如果Key和value是一樣的,不適合上面的程式碼
集合推導式
計算列表中每個值的平方,自帶去重功能
squared = {x**2 for x in [1, -1, 2]} print(squared)
執行輸出:{1, 4}
a = {1,1,4} print(type(a))
執行輸出:<class 'set'> 結果是一個集合,它也是用{}表示的。
集合和字典是有區別的:
有鍵值對的,是字典,比如{‘k1′:1,’k1’:2}
沒有鍵值對的,是集合,比如{1,2,3,4}
二、生成器表達式
與列表推導式相同,只是將[ ]改為( )
l_obj = ('還珠格格第%s部' % i for i in range(1,4)) print(l_obj)
結果是一個生成器對象:<generator object <genexpr> at 0x000002DDBEBADE60>
取值使用__next__方法
l_obj = ('還珠格格第%s部' % i for i in range(1,4)) print(l_obj.__next__()) print(l_obj.__next__()) print(l_obj.__next__())
輸出結果: 還珠格格第1部 還珠格格第2部 還珠格格第3部
列表推導式:一目了然,占記憶體
生成器表達式: 不便看出,節省記憶體。