本文作者:陳丹慧拱层,中南財(cái)經(jīng)政法大學(xué)金融學(xué)院
文字編輯:任?哲
技術(shù)總編:張馨月
導(dǎo)讀
已知列表list1=[1,2,3,4,5,6,7,8,9,10]
,如果我們想把list1中每個(gè)元素都加上2010夺衍,生成一個(gè)新列表璧瞬,該怎么做呢?
勤奮的小白會(huì)這樣做:
list1=list(range(1,11))
list2=[]
for i in list1:
list2.append(i+2010)
list2
而用列表生成式(List Comprehensions)一行就能代替上述代碼:
[i+2010 for i in range(1,11)]
是不是很神奇呢唉俗?一行代碼就創(chuàng)造了有規(guī)律的新列表陌凳,看起來(lái)就像一根藤上結(jié)出了果實(shí)。今天须肆,我就來(lái)帶大家玩轉(zhuǎn)列表生成式匿乃,掌握列表生成式的更多用法。
1.語(yǔ)法
根據(jù)Python官方文檔的說明豌汇,列表生成式是一種簡(jiǎn)便快捷地創(chuàng)造列表的方式幢炸。它通常是用來(lái)創(chuàng)建一個(gè)新列表,這個(gè)新列表的元素是在可迭代對(duì)象
(包括字符串拒贱、元組宛徊、列表、字典逻澳、集合等可被for遍歷循環(huán)的對(duì)象)的基礎(chǔ)上生成的闸天。
(1)基本語(yǔ)法
[exp for iter_var in iterable]
作用過程:迭代iterable
中的元素,再根據(jù)表達(dá)式exp
計(jì)算出一個(gè)新值赡盘,最后將所有計(jì)算出的新值放在列表中号枕,就生成了一個(gè)新的列表缰揪。
剛剛在導(dǎo)讀中給大家展示了用列表生成式在list1的基礎(chǔ)上生成list2陨享,這里再詳解一下它的作用過程:
[i+2010 for i in range(1,11)]
首先我們知道range(1,11)生成一個(gè)1到10的有序序列,它是可以被for遍歷循環(huán)的钝腺。第一輪時(shí)抛姑,賦值i=1,再根據(jù)"i+2010"算出新值"2011"艳狐;第二輪時(shí)定硝,賦值i=2,再根據(jù)表達(dá)式算出新值"2012"……最后一輪時(shí)毫目,賦值i=10蔬啡,根據(jù)表達(dá)式算出的新值為"2020"。這些新值會(huì)按照順序排列放在一個(gè)的新列表中被返回镀虐,即我們?cè)趯?dǎo)讀中看到的輸出結(jié)果箱蟆。
(2)增加if語(yǔ)句過濾功能
[exp for iter_var in iterable if_exp]
作用過程:迭代iterable
中每個(gè)元素,每次迭代都判斷下if_exp
表達(dá)式是否為真刮便,如果為True
則執(zhí)行下一步空猜,將返回元素通過exp
得到一個(gè)新值;如果為False
,則丟棄該元素辈毯,進(jìn)行下一次迭代坝疼。最后,所有通過exp
計(jì)算出來(lái)的新值將以一個(gè)新列表的形式返回谆沃。
我們用它來(lái)實(shí)現(xiàn)以下功能:過濾原列表list3=[-4,-2,0,2,4]
中的負(fù)數(shù)钝凶。
list3=[-4,-2,0,2,4]
list4=[]
#不用列表生成式
for x in list3:
if x>=0:
list4.append(x)
#使用列表生成式
list4=[x for x in list3 if x >=0]
list4
(3)嵌套循環(huán)
[exp for iter_var_A in iterrable_A for iter_var_B in iterable_B]
作用過程:先迭代iterable_A
中的元素,每當(dāng)?shù)粋€(gè)iterable_A
中的一個(gè)元素唁影,隨之就會(huì)把iterable_B
中每個(gè)元素都迭代一遍腿椎,最后根據(jù)表達(dá)式exp
算出新值,并返回一個(gè)新列表夭咬。
乍一看啃炸,是不是頭皮發(fā)麻。不要怕卓舵,看了下面的例子你會(huì)豁然開朗南用。
給定list5=["星期","周"]
,list6=["一","二","三","四","五","六","七"]
掏湾,用列表生成式生成一個(gè)新列表list7裹虫,將新列表中元素為list5,list6對(duì)應(yīng)位置元素相加融击,代碼如下:
list5=["星期","周"]
list6=["一","二","三","四","五","六","日"]
list7=[]
#不使用列表生成式
for i in list5:
for j in list6:
list7.append("%s"%i+"%s"%j)
#使用列表生成式
list7=["%s"%i+"%s"%j for i in list5 for j in list6]
list7
最后輸出結(jié)果如下:
2.應(yīng)用
(1)字典里的應(yīng)用
列表生成式結(jié)合字典的items方法筑公,可以生成鍵值對(duì)列表:
dict={"Jack":179,"Rose":172}
list=[k+"身高為"+str(v)+"cm" for k,v in dict.items()]
list
輸出結(jié)果如下:
(2)批量去空格
結(jié)合字符串的strip方法來(lái)刪除原列表中所有字符串元素中的空白字符,生成一個(gè)新列表:
list=[' 爬蟲',' 俱','樂部 ']
[s.strip() for s in list2]
輸出結(jié)果如下:
(3)輸出某個(gè)目錄下所有文件夾和文件名
結(jié)合os模塊尊浪,列表生成式能輸出某個(gè)目錄下所有文件夾和文件名
import os
[d for d in os.listdir("E:/Python/python基礎(chǔ)")]
輸出結(jié)果如下:
今天的介紹就到這里了匣屡。希望大家能好好應(yīng)用列表生成式,讓你的代碼簡(jiǎn)潔又美觀拇涤!之后我們還會(huì)介紹更多有趣的知識(shí)捣作,來(lái)幫你提升效率,敬請(qǐng)期待哦鹅士!