Python進(jìn)階核心知識(shí)點(diǎn)(4)- 列表推導(dǎo)式

在用Python進(jìn)行coding的世界里前域,列表是萬金油一般的存在辕近。作為Python中最常用的數(shù)據(jù)結(jié)構(gòu),熟練掌握列表的各種使用方法匿垄,是一名Python初級(jí)程序員的日常移宅。而列表解析式(list comprehension归粉, 也成為列表推導(dǎo)式)作為非常pythonic的用法,能夠熟練運(yùn)用則是一個(gè)進(jìn)階Pythoner的標(biāo)志漏峰。這一次我們就來總結(jié)一下列表解析式的各種用法糠悼,一次性全部掌握。

首先明確列表解析式的作用浅乔,即快速簡(jiǎn)潔的創(chuàng)建列表倔喂。其簡(jiǎn)潔性在于能用一行代碼代替十幾行代碼,而且不損失任何可讀性靖苇。而且用列表解析式生成一個(gè)列表比普通的for循環(huán)加上append方法生成的列表要快很多席噩,這也是為什么提倡使用列表解析式來生成列表的原因。下面我們就按照3個(gè)步驟贤壁,由淺入深的來解析列表解析式

1.基本格式:

[exp for i in k]悼枢, 其中:

  • exp: 表達(dá)式,可以是一個(gè)函數(shù)脾拆,變量為i(也可以與i無關(guān))
  • k: k為一個(gè)可迭代對(duì)象馒索,如列表。
    應(yīng)用舉例:
  1. 一句代碼輸出一個(gè)1到5的立方
  2. 一句代碼創(chuàng)建一個(gè)列表假丧,包含10個(gè)60-100的隨機(jī)整數(shù)
# 一句代碼輸出一個(gè)1到5的立方
[i**3 for i in range(1,6)]
>>>[1, 8, 27, 64, 125]

# 一句代碼創(chuàng)建一個(gè)列表双揪,包含10個(gè)60-100的隨機(jī)整數(shù)(模擬學(xué)生成績)
import random
[random.randint(60,100) for _ in range(10)]
>>> [76, 89, 62, 83, 61, 80, 89, 99, 76, 78]

上面的例子中动羽,第一個(gè)例子的表達(dá)式和i相關(guān)包帚,第二個(gè)和i沒有關(guān)系。表達(dá)式的作用就是生成目標(biāo)列表中的元素运吓,而后面的for循環(huán)決定了生成的列表元素的個(gè)數(shù)渴邦。

2. 加入for循環(huán)嵌套

列表推導(dǎo)式中的for循環(huán)支持嵌套功能。
舉例: 現(xiàn)有3個(gè)列表分別保存了顧客的姓名拘哨,衣服的顏色谋梭,尺碼,用一句代碼輸出所有顧客和衣服顏色尺碼的組合

names = ['zhangsan', 'lisi', 'wangba']
color = ['red', 'yellow']
size = ['S', 'M', 'L']
[name + '-' + c + '-' + s for name in names for c in color for s in size]
>>>
['zhangsan-red-S',
 'zhangsan-red-M',
 'zhangsan-red-L',
 'zhangsan-yellow-S',
 'zhangsan-yellow-M',
 'zhangsan-yellow-L',
 'lisi-red-S',
 'lisi-red-M',
 'lisi-red-L',
 'lisi-yellow-S',
 'lisi-yellow-M',
 'lisi-yellow-L',
 'wangba-red-S',
 'wangba-red-M',
 'wangba-red-L',
 'wangba-yellow-S',
 'wangba-yellow-M',
 'wangba-yellow-L']

上面的代碼等價(jià)于:

for name in names:
    for c in color:
        for s in size:
            print(name + '-' + c + '-' + 's')
>>>
zhangsan-red-s
zhangsan-red-s
zhangsan-red-s
zhangsan-yellow-s
zhangsan-yellow-s
zhangsan-yellow-s
lisi-red-s
lisi-red-s
lisi-red-s
lisi-yellow-s
lisi-yellow-s
lisi-yellow-s
wangba-red-s
wangba-red-s
wangba-red-s
wangba-yellow-s
wangba-yellow-s
wangba-yellow-s

從這個(gè)例子可以充分體會(huì)到列表解析式的簡(jiǎn)潔倦青!

3. 篩選功能

更進(jìn)一步瓮床,列表推導(dǎo)式中for循環(huán)后還可以加入if (或者if...else...)進(jìn)行篩選 。
舉例: 一句代碼輸出0-100內(nèi)可以被7整除的整數(shù)

# 輸出1-100內(nèi)可以被7整除的數(shù):
[i for i in range(1,101) if i%7 == 0]
>>>
[7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84, 91, 98]

綜合上面的案例产镐,我們可以清晰的看到列表推導(dǎo)式的簡(jiǎn)潔與優(yōu)雅隘庄!同時(shí)也體現(xiàn)Python的強(qiáng)大之處。

4. 更多案例

  1. 現(xiàn)有2個(gè)長度一樣的數(shù)字列表癣亚,完成對(duì)應(yīng)位置的元素相乘生成新的列表
a = [i for i in range(1,10)]
b = [i+1 for i in a]
print(a)
print(b)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
[2, 3, 4, 5, 6, 7, 8, 9, 10]
# 使用列表解析式完成對(duì)應(yīng)位置的元素相乘
[i*j for i, j in zip(a,b)]
>>>
[2, 6, 12, 20, 30, 42, 56, 72, 90]
  1. 現(xiàn)有一份學(xué)生名單丑掺,將名單中以S開頭且長度大于7的姓名篩選出來
# 先模擬一份名單
name=["Smialexk","Koldboy","Smithweird","Lonosong", \
"Sam","Solway","Podykx","Sa-jack","Sykx","Songarx" ,"Ponkx",'Ponyma']
# 篩選S開頭且長度大于7的名字
[i for i in name if len(i) > 7 and i.startswith('S')]
>>>
['Smialexk', 'Smithweird']

其實(shí)上面這個(gè)例子在引入一些復(fù)雜的邏輯就可以完成一個(gè)更復(fù)雜的事情了,比如現(xiàn)在有一份csv格式的小說述雾,可以用這個(gè)邏輯遍歷整份csv文件街州,把想要的人名提取出來在統(tǒng)計(jì)詞頻就可以大概這道這個(gè)小說有哪些豬腳了兼丰,一般豬腳的名字肯定會(huì)反復(fù)出現(xiàn)嘛。

OK唆缴,本次分享就到這里鳍征。更多精彩內(nèi)容也可以W X搜索,并關(guān)注公眾號(hào):‘Python數(shù)據(jù)科學(xué)家之路“ 琐谤,期待您的到來和我交流

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟆技,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子斗忌,更是在濱河造成了極大的恐慌质礼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件织阳,死亡現(xiàn)場(chǎng)離奇詭異眶蕉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唧躲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門造挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人弄痹,你說我怎么就攤上這事饭入。” “怎么了肛真?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵谐丢,是天一觀的道長。 經(jīng)常有香客問我蚓让,道長乾忱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任历极,我火速辦了婚禮窄瘟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘趟卸。我一直安慰自己蹄葱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布锄列。 她就那樣靜靜地躺著图云,像睡著了一般。 火紅的嫁衣襯著肌膚如雪右蕊。 梳的紋絲不亂的頭發(fā)上琼稻,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音饶囚,去河邊找鬼帕翻。 笑死鸠补,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嘀掸。 我是一名探鬼主播紫岩,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼睬塌!你這毒婦竟也來了泉蝌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤揩晴,失蹤者是張志新(化名)和其女友劉穎勋陪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硫兰,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诅愚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了劫映。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片违孝。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泳赋,靈堂內(nèi)的尸體忽然破棺而出雌桑,到底是詐尸還是另有隱情,我是刑警寧澤祖今,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布校坑,位于F島的核電站,受9級(jí)特大地震影響衅鹿,放射性物質(zhì)發(fā)生泄漏撒踪。R本人自食惡果不足惜过咬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一大渤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掸绞,春花似錦泵三、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至敞映,卻和暖如春较曼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背振愿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國打工捷犹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留弛饭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓萍歉,卻偏偏與公主長得像侣颂,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枪孩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容