Python 列表推導(dǎo)式:簡潔蛉迹、高效的數(shù)據(jù)操作藝術(shù)

Python 列表推導(dǎo)式:簡潔傅寡、高效的數(shù)據(jù)操作藝術(shù)

Python 的列表推導(dǎo)式,這個看似簡單的語法糖北救,實(shí)則內(nèi)含無限威力荐操。在 Python 代碼編寫中,列表推導(dǎo)式的靈活性和簡潔性讓它成為了不可或缺的一部分珍策。在這篇文章中托启,我們將更全面、更深入地探討列表推導(dǎo)式攘宙,從基礎(chǔ)的概念認(rèn)識屯耸,到各類進(jìn)階的用法和操作拐迁,我們一一揭秘。最后疗绣,我們還將在 "One More Thing" 部分分享一個非常有趣且實(shí)用的列表推導(dǎo)式技巧线召,這會讓你在編程道路上又多一份強(qiáng)大的工具。

1. 列表推導(dǎo)式:語法糖的力量

列表推導(dǎo)式多矮,就是一種在 Python 中創(chuàng)建列表的方式缓淹,它的基礎(chǔ)形式如下:

[expression for item in iterable]

它實(shí)質(zhì)上是一個 for 循環(huán)的簡化形式。例如塔逃,我們可以用它來創(chuàng)建一個包含 0 到 9 平方的列表:

squares = [x**2 for x in range(10)]
print(squares) # Output: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

這樣讯壶,你不需要再使用傳統(tǒng)的 for 循環(huán)來創(chuàng)建列表,代碼更加簡潔和清晰湾盗。

2. 過濾元素:帶條件的列表推導(dǎo)式

列表推導(dǎo)式更強(qiáng)大的地方在于鹏溯,我們可以在其中加入條件判斷,以過濾出我們想要的元素:

even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # Output: [0, 4, 16, 36, 64]

在這個例子中淹仑,我們只生成了偶數(shù)的平方丙挽,只需加入一個簡單的 if 條件,我們就可以靈活地過濾出我們需要的元素匀借。

3. 復(fù)雜的數(shù)據(jù)結(jié)構(gòu):嵌套的列表推導(dǎo)式

更進(jìn)一步颜阐,列表推導(dǎo)式還可以嵌套使用,處理更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)吓肋,比如我們要將一個嵌套列表展平:

nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_list = [x for sublist in nested_list for x in sublist]
print(flattened_list) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]

這個例子中凳怨,我們將一個二維的嵌套列表展平成了一維列表,就像是將多層次的數(shù)據(jù)展開是鬼,方便我們進(jìn)行后續(xù)處理肤舞。

4. 數(shù)據(jù)變形:帶表達(dá)式的列表推導(dǎo)式

列表推導(dǎo)式中的表達(dá)式可以幫助我們對數(shù)據(jù)進(jìn)行變形:

strings = ['Hello', 'World', 'In', 'Python']
lowercase_strings = [s.lower() for s in strings]
print(lowercase_strings) # Output: ['hello', 'world', 'in', 'python']

在這個例子中,我們將一個包含幾個字符串的列表均蜜,通過 str.lower() 函數(shù)李剖,將其轉(zhuǎn)換成了全小寫。通過改變表達(dá)式囤耳,我們可以在生成新列表的同時篙顺,對數(shù)據(jù)進(jìn)行各種變形操作。

5. 推廣至其他數(shù)據(jù)結(jié)構(gòu):字典和集合的推導(dǎo)式

推導(dǎo)式不僅僅可以應(yīng)用于列表充择,還可以推廣到字典和集合中:

squared_dict = {x: x**2 for x in range(5)}
print(squared_dict) # Output: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

squared_set = {x**2 for x in range(5)}
print(squared_set) # Output: {0, 1, 4, 16, 9}

這兩個例子分別演示了字典推導(dǎo)式和集合推導(dǎo)式的用法德玫,這些結(jié)構(gòu)的推導(dǎo)式可以更方便我們處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。

6. 性能優(yōu)化:列表推導(dǎo)式與 map/filter 的比較

列表推導(dǎo)式不僅代碼更加簡潔椎麦,實(shí)際上在很多情況下宰僧,列表推導(dǎo)式的執(zhí)行效率也優(yōu)于傳統(tǒng)的 mapfilter 函數(shù):

import time

# Using list comprehension
start_time = time.time()
squares = [x**2 for x in range(1000000)]
end_time = time.time()
print(f"List comprehension took {end_time - start_time} seconds")

# Using map function
start_time = time.time()
squares = list(map(lambda x: x**2, range(1000000)))
end_time = time.time()
print(f"Map function took {end_time - start_time} seconds")

在這個例子中,我們分別用列表推導(dǎo)式和 map 函數(shù)創(chuàng)建一個包含一百萬個元素的列表观挎,可以看到列表推導(dǎo)式的執(zhí)行時間通常要少于 map 函數(shù)琴儿。

One More Thing

在我的 GitHub 學(xué)習(xí)過程以及在各種技術(shù)博客中閱讀段化,我發(fā)現(xiàn)一個關(guān)于列表推導(dǎo)式的有趣且實(shí)用的技巧,那就是使用列表推導(dǎo)式實(shí)現(xiàn)全排列:

perms = [(x, y, z) for x in range(3) for y in range(3) for z in range(3) if x != y and y != z and x != z]
print(perms) # Output: [(0, 1, 2), (0, 2, 1), (1, 0, 2), (1, 2, 0), (2, 0, 1), (2, 1, 0)]

這個例子通過列表推導(dǎo)式生成了 3 個元素的全排列凤类,使用了嵌套循環(huán)和條件判斷穗泵,非常簡潔而高效。

總的來說谜疤,Python 的列表推導(dǎo)式是一個非常強(qiáng)大而靈活的工具趾痘,能夠幫助我們更好地處理數(shù)據(jù)和創(chuàng)建數(shù)據(jù)結(jié)構(gòu)叛薯。希望這篇文章能幫助你更深入地理解和應(yīng)用列表推導(dǎo)式阶牍,讓你的 Python 代碼更加簡潔和高效亏拉。

如有幫助,請多關(guān)注
TeahLead_KrisChang坐桩,10+年的互聯(lián)網(wǎng)和人工智能從業(yè)經(jīng)驗(yàn)尺棋,10年+技術(shù)和業(yè)務(wù)團(tuán)隊管理經(jīng)驗(yàn),同濟(jì)軟件工程本科绵跷,復(fù)旦工程管理碩士膘螟,阿里云認(rèn)證云服務(wù)資深架構(gòu)師,上億營收AI產(chǎn)品業(yè)務(wù)負(fù)責(zé)人碾局。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荆残,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子净当,更是在濱河造成了極大的恐慌内斯,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件像啼,死亡現(xiàn)場離奇詭異俘闯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)忽冻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門真朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甚颂,你說我怎么就攤上這事蜜猾。” “怎么了振诬?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衍菱。 經(jīng)常有香客問我赶么,道長,這世上最難降的妖魔是什么脊串? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任辫呻,我火速辦了婚禮清钥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘放闺。我一直安慰自己祟昭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布怖侦。 她就那樣靜靜地躺著篡悟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匾寝。 梳的紋絲不亂的頭發(fā)上搬葬,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音艳悔,去河邊找鬼急凰。 笑死,一個胖子當(dāng)著我的面吹牛猜年,可吹牛的內(nèi)容都是我干的抡锈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼乔外,長吁一口氣:“原來是場噩夢啊……” “哼床三!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袁稽,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勿璃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后推汽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體补疑,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年歹撒,在試婚紗的時候發(fā)現(xiàn)自己被綠了莲组。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡暖夭,死狀恐怖锹杈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情迈着,我是刑警寧澤竭望,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站裕菠,受9級特大地震影響咬清,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一旧烧、第九天 我趴在偏房一處隱蔽的房頂上張望影钉。 院中可真熱鬧,春花似錦掘剪、人聲如沸平委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廉赔。三九已至,卻和暖如春予权,著一層夾襖步出監(jiān)牢的瞬間昂勉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工扫腺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岗照,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓笆环,卻偏偏與公主長得像攒至,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躁劣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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