網(wǎng)站首頁 編程語言 正文
1. 引言
在Python中有非常多且好用的技巧,其中使用最多的是列表生成式,往往可以將復(fù)雜的邏輯用簡單的語言來實(shí)現(xiàn),本文重點(diǎn)介紹列表生成式應(yīng)用的八重境界。
閑話少說,我們直接開始吧!
2. Level1: 基礎(chǔ)用法
最最簡單的列表生成式,舉例如下:
a = [1, 2, 3]
b = [n*2 for n in a]
# b = [2, 4, 6]
上述代碼實(shí)現(xiàn)了對列表中單個元素求平方的操作。
3. Level2: 加入條件語句
其實(shí),我們可以在列表生成式中添加if來獲取我們需要的元素,舉例如下:
a = [1, 2, 3, 4, 5]
b = [n for n in a if n<4]
# b = [1, 2, 3]
上述代碼中,我們添加了一個條件來決定在列表生成式中應(yīng)該保留哪些元素。這里我們的條件是,如果n<4,則只保留小于4的數(shù)。
4. Level3: 加入 enumerate()
我們知道,枚舉函數(shù)enumerate()可以同時生成元素以及相應(yīng)的元素的索引。如果我們需要元素的索引以及元素,我們可以在列表生成式中使用函數(shù)enumerate()。
舉例如下:
a = ["apple", "orange", "pear"]
b = [(i,fruit) for i,fruit in enumerate(b)]
# b is [(0,"apple"), (1,"orange"), (2,"pear")]
5. Level4: 加入 zip()
更進(jìn)一步,我們知道函數(shù)zip()可以非常方便地使我們同時遍歷2個或多個列表。
在列表生成式中加入函數(shù)zip(),樣例如下:
a = ["apple", "orange", "pear"]
a2 = ["pie", "juice", "cake"]
b = [i+j for i,j in zip(a, a2)]
# b is ["applepie", "orangejuice", "pearcake"]
6. Level5: 加入三目運(yùn)算符
三元運(yùn)算符A if condition else B允許我們根據(jù)條件將每個元素轉(zhuǎn)換為其他元素。
在列表生成式中同樣可以使用三目運(yùn)算符,樣例如下:
a = [56, 45, 76, 23]
b = [("pass" if n>=50 else "fail") for n in a]
# b is ["pass", "fail", "pass", "fail"]
7. Level6: 嵌套循環(huán)
其實(shí),我們當(dāng)然也可以在列表生成式中使用嵌套循環(huán),我們來看個例子,如下:
a = [10, 20, 30]
a2 = [1, 2, 3]
b = [i+j for i in a for j in a2]
# b is [11, 12, 13, 21, 22, 23, 31, 32, 33]
實(shí)質(zhì)上,上述實(shí)現(xiàn)等價代碼如下:
newlist = []
for i in a:
for j in a2:
newlist.append( i+j )
8. Level7: 嵌套列表生成式
更高級一點(diǎn),我們可以在列表生成式中嵌套列表生成式,舉例如下:
a = [1, 2, 3]
b = [[i for i in range(1, n+1)] for n in a]
# b is [[1], [1, 2], [1, 2, 3]]
9. Level8: 合并上述所有技巧
最后的最后,讓我們將上述介紹的幾個技巧進(jìn)行合并,我們來看如下例子:
a = [1, 2, 3, 4, 5]
b = [[xx if xx>yy else yy for xx in range(x) for yy in range(y)] for i,(x,y) in enumerate(zip(a, a[::-1])) if i%2==0]
# [[0, 1, 2, 3, 4], [0, 1, 2, 1, 1, 2, 2, 2, 2], [0, 1, 2, 3, 4]]
上述實(shí)現(xiàn)意義不大,我們嘗試應(yīng)用上了上面介紹的所有技巧,但是畢竟代碼可讀性太大。其主要目的還是為了說明我們可以結(jié)合多種技巧,來使我們的列表生成式實(shí)現(xiàn)更加強(qiáng)大的功能。
10. 應(yīng)用栗子
好吧,我們來看個實(shí)際的應(yīng)用例子吧!
假設(shè)我們班級上有如下同學(xué)信息:
students = [
("bob", "m", [67, 89, 60]),
("alice", "f", [97, 85, 61]),
("cassie", "f", [78, 91, 89]),
("tim", "m", [47, 57, 24]),
("tom", "m", [91, 79, 72]),
]
上述列表展示了每個學(xué)生的姓名、性別和考試成績,這里假設(shè)如果一個學(xué)生的平均分?jǐn)?shù)≥ 50,那么這個學(xué)生有資格獲獎。這里我們需要編寫代碼,來找到上述列表中有資格獲獎的男生。
樣例代碼如下:
x = [(name, "eligible" if sum(scores)/len(scores) >=50 else "not eligible") for name,gender,scores in students if gender=="m"]
#[('bob', 'eligible'), ('tim', 'not eligible'), ('tom', 'eligible')]
11. 總結(jié)
本文重點(diǎn)介紹了理解Python中的列表生成式的八重境界,并給出了相應(yīng)的代碼示例。
原文鏈接:https://blog.csdn.net/sgzqc/article/details/126650419
相關(guān)推薦
- 2022-05-08 使用Visual?Studio編寫單元測試_實(shí)用技巧
- 2022-06-18 Elasticsearch之基本查詢及組合查詢操作示例_其它綜合
- 2022-07-11 Android Studio環(huán)境配置
- 2022-08-06 python列表去重的5種常見方法實(shí)例_python
- 2023-05-20 Golang中map的三種聲明定義方式實(shí)現(xiàn)_Golang
- 2022-02-14 flutter封裝自定義打印信息
- 2022-06-02 Go語言數(shù)據(jù)類型詳細(xì)介紹_Golang
- 2022-01-15 Meteor 項(xiàng)目部署至服務(wù)器(windows)
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支