在編寫程序或者查看別人的程序時(shí),經(jīng)常會(huì)遇到列表生成式,這個(gè)使用起來(lái)并不復(fù)雜,但是非常有用,使我們的代碼更加簡(jiǎn)潔靈活。很多python使用者并不太會(huì)使用它。今天,就給大家詳細(xì)講解列表生成式和生成器表達(dá)式的使用
?
一、列表生成式
優(yōu)點(diǎn):一行代碼幾乎可以搞定所需要的任何列表
缺點(diǎn):容易著迷,不易排錯(cuò),不能超過(guò)三個(gè)循環(huán)
* 用列表推導(dǎo)式能構(gòu)建的任何列表,用別的都可以構(gòu)建,比如for循環(huán)
* 列表推導(dǎo)式,最多不超過(guò)3個(gè)for循環(huán)。判斷只能用一個(gè)
?
1. 循環(huán)模式:模板:[經(jīng)過(guò)加工的i for i in 可迭代對(duì)象]
使用for循環(huán)方法
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)
上面的代碼,可以一行搞定。用列表推導(dǎo)式就可以了
li = ['還珠格格第%s部' %i for i in range(1,4)] print(li) li = ['還珠格格第{}部'.format(i)
for i in range(1,4)] # 上下結(jié)果相同 print(li)
例:求1~10平方結(jié)果
li = [i ** 2 for i in range(1,11)] print(li) 執(zhí)行輸出:[1, 4, 9, 16, 25, 36, 49,
64, 81, 100]
2. 篩選模式:[經(jīng)過(guò)加工的i for i in 可迭代對(duì)象 if 條件 篩選]
30以內(nèi)所有能被3整除的數(shù)
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以內(nèi)所有能被3整除的數(shù)的平方
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] 找到嵌套列表中名字含有兩個(gè)'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']
常用的是列表推導(dǎo)式
?
字典推導(dǎo)式
將一個(gè)字典的key和value對(duì)調(diào)
dict = {'a': 10, 'b': 34} dict_frequency = {dict[k]: k for k in mcase} print
(dict_frequency) 執(zhí)行輸出:{10: 'a', 34: 'b'}
相當(dāng)于
dict = {'a': 10, 'b': 34} dict_frequency = {} for k in dict: dict_frequency[k]=
dict[k]print(dict_frequency) 如果Key和value是一樣的,不適合上面的代碼
集合推導(dǎo)式
計(jì)算列表中每個(gè)值的平方,自帶去重功能
squared = {x**2 for x in [1, -1, 2]} print(squared) 執(zhí)行輸出:{1, 4} a = {1,1,4}
print(type(a)) 執(zhí)行輸出:<class 'set'> 結(jié)果是一個(gè)集合,它也是用{}表示的。
集合和字典是有區(qū)別的:
有鍵值對(duì)的,是字典,比如{'k1':1,'k1':2}
沒(méi)有鍵值對(duì)的,是集合,比如{1,2,3,4}
?
二、生成器表達(dá)式
與列表推導(dǎo)式相同,只是將[ ]改為( )
l_obj = ('還珠格格第%s部' % i for i in range(1,4)) print(l_obj)
結(jié)果是一個(gè)生成器對(duì)象:<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__()) 輸出結(jié)果: 還珠格格第1部 還珠格格第2部 還珠格格第3部
列表推導(dǎo)式:一目了然,占內(nèi)存
生成器表達(dá)式: 不便看出,節(jié)省內(nèi)存。
熱門工具 換一換
