官术网_书友最值得收藏!

2.1.7 列表推導(dǎo)式

如前所述,在Python中我們可以使用列表推導(dǎo)式過(guò)濾和映射列表。在處理列表時(shí),這種形式通常比f(wàn)ilter和map函數(shù)更好,因?yàn)樗恼Z(yǔ)法更簡(jiǎn)潔和易讀。

列表推導(dǎo)式映射列表的語(yǔ)法結(jié)構(gòu)如下:

它分為兩個(gè)部分:

?for<item>in<list>是一個(gè)for循環(huán),負(fù)責(zé)迭代<list>中的元素;

?<expression>是一個(gè)映射表達(dá)式,負(fù)責(zé)將<item>映射到其他東西上。

讓我們重復(fù)之前做過(guò)的練習(xí),將一個(gè)名稱列表映射到每個(gè)名稱的長(zhǎng)度列表,這次使用列表推導(dǎo)式:

或許你已經(jīng)明白,為什么Python程序員傾向于使用列表推導(dǎo)式而非map函數(shù);上面的例子讀起來(lái)就像日常英語(yǔ):“name列表中(每個(gè))名稱的名稱長(zhǎng)度。”在本例中,for name in names遍歷原始列表中的名稱,然后將每個(gè)名稱的長(zhǎng)度(len(name))作為結(jié)果輸出。

使用列表推導(dǎo)式過(guò)濾列表,可以在推導(dǎo)式的末尾添加一個(gè)if子句:

例如,如果我們想過(guò)濾一個(gè)名稱列表,只保留以A開(kāi)頭的名稱,列表推導(dǎo)式可以這么寫:

本例中有兩點(diǎn)需要注意:映射表達(dá)式是name自身(恒等映射,映射后的對(duì)象不變),過(guò)濾操作使用了字符串的startswith方法。只有當(dāng)字符串以給定的參數(shù)作為前綴時(shí),此方法才會(huì)返回True。

我們可以在同一個(gè)列表推導(dǎo)式中進(jìn)行過(guò)濾和映射操作。例如,假設(shè)我們想過(guò)濾名稱列表中超過(guò)5個(gè)字母的名稱,然后構(gòu)造一個(gè)新的列表,其元素是原名稱及其長(zhǎng)度組成的元組。我們可以很容易地做到這一點(diǎn):

為了便于比較,讓我們看看如果使用filter和map函數(shù),會(huì)是什么樣子:

如你所見(jiàn),結(jié)果相同,但列表推導(dǎo)式的版本更簡(jiǎn)單易讀。越容易閱讀的東西也越容易維護(hù),因此列表推導(dǎo)式將是我們過(guò)濾和映射列表的首選方式。

現(xiàn)在讓我們將注意力轉(zhuǎn)向第二個(gè)范式:面向?qū)ο缶幊獭?/p>

主站蜘蛛池模板: 浑源县| 望江县| 鄯善县| 二手房| 旬邑县| 伊春市| 宝鸡市| 浮山县| 札达县| 晋宁县| 綦江县| 修文县| 南投市| 高青县| 府谷县| 榆林市| 巴东县| 环江| 舞阳县| 富锦市| 柏乡县| 政和县| 温州市| 偃师市| 宁强县| 汉川市| 巴林左旗| 茶陵县| 丹阳市| 长子县| 应城市| 海盐县| 彰化市| 湘西| 偃师市| 靖西县| 海原县| 讷河市| 南通市| 永兴县| 吉木萨尔县|