南京飛酷帶你了解:Python高級技巧之優(yōu)雅地過濾列表中的指定元素
2024-06-04 加入收藏
水果店有一個(gè)水果的列表:
fruits = [
'蘋果',
'香蕉',
'橙子',
'葡萄',
'草莓',
'藍(lán)莓',
'櫻桃',
'西瓜',
'芒果',
'獼猴桃',
'檸檬',
'柚子',
'石榴',
'桃子',
'梨子',
'李子',
'菠蘿',
'橄欖',
'柿子',
'菠蘿蜜'
]
因?yàn)槲蚁矚g吃“莓”
類的水果,假如我想把fruit
列表中的“莓”
類的水果篩選出來,我該怎么用代碼去實(shí)現(xiàn)呢?
方法一 使用for循環(huán)
使用for循環(huán)語句進(jìn)行篩選是最常規(guī)的方法。
berries = []
for f in fruits:
if '莓' in f:
berries.append(f)
print(berries)
# ['草莓', '藍(lán)莓']
方法二 使用列表推導(dǎo)式 + 三元表達(dá)式
使用列表推導(dǎo)只需一行就能搞定,代碼也會(huì)更加
Pythonic
。
回顧下Python三元表達(dá)式:
三元表達(dá)式由三個(gè)部分組成:一個(gè)條件表達(dá)式、一個(gè)真值表達(dá)式和一個(gè)假值表達(dá)式。
真值表達(dá)式 if 條件表達(dá)式 else 假值表達(dá)式
berries = [f for f in fruits if '莓' in f] # 省略假值表達(dá)式
print(berries)
# ['草莓', '藍(lán)莓']
方法三 使用內(nèi)置函數(shù)filter
內(nèi)置函數(shù)
filter
接受兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)函數(shù),第二個(gè)參數(shù)是一個(gè)可迭代對象。該函數(shù)會(huì)對可迭代對象中的每個(gè)元素都調(diào)用函數(shù),并返回函數(shù)返回值為
True
的元素。
berries = list(filter(lambda f: '莓' in f, fruits))
print(berries)
方法四 生成器推導(dǎo)式
這個(gè)方法和列表推導(dǎo)式非常相像,但生成器的性能優(yōu)勢,懂的都懂~~
berries = (f for f in fruits if '莓' in f)
print(berries)
# <generator object <genexpr> at 0x0000023495E96CF0>
for f in berries:
print(f)
# 草莓
# 藍(lán)莓
列表推導(dǎo)式需要預(yù)先計(jì)算所有結(jié)果并存儲(chǔ)在內(nèi)存中,因此它會(huì)比生成器推導(dǎo)式消耗更多的內(nèi)存。
當(dāng)處理數(shù)據(jù)量非常大時(shí),如果使用列表推導(dǎo)式可能會(huì)導(dǎo)致內(nèi)存溢出或者程序運(yùn)行緩慢。
而生成器推導(dǎo)式則可以在迭代過程中動(dòng)態(tài)計(jì)算結(jié)果,從而減少內(nèi)存使用和提高程序性能。
那我該怎么選呢?
方法一和方法二 適合數(shù)據(jù)量不大的處理,且代碼更易讀;
方法三和方法四 適合數(shù)據(jù)量較大的處理。