Python高級技巧:優雅地過濾列表中的指定元素
2024-05-06 加入收藏
歡迎訪問Python3分鐘系列。花3分鐘時間,學習或溫習一個Python知識點。今天是第200。
水果店有一個水果的列表:
fruits = [
'蘋果',
'香蕉',
'橙子',
'葡萄',
'草莓',
'藍莓',
'櫻桃',
'西瓜',
'芒果',
'獼猴桃',
'檸檬',
'柚子',
'石榴',
'桃子',
'梨子',
'李子',
'菠蘿',
'橄欖',
'柿子',
'菠蘿蜜'
]
因為我喜歡吃“莓”
類的水果,假如我想把fruit
列表中的“莓”
類的水果篩選出來,我該怎么用代碼去實現呢?
方法一 使用for循環
使用for循環語句進行篩選是最常規的方法。
berries = []
for f in fruits:
if '莓' in f:
berries.append(f)
print(berries)
# ['草莓', '藍莓']
方法二 使用列表推導式 + 三元表達式
使用列表推導只需一行就能搞定,代碼也會更加
Pythonic
。
回顧下Python三元表達式:
三元表達式由三個部分組成:一個條件表達式、一個真值表達式和一個假值表達式。
真值表達式 if 條件表達式 else 假值表達式
berries = [f for f in fruits if '莓' in f] # 省略假值表達式
print(berries)
# ['草莓', '藍莓']
方法三 使用內置函數filter
內置函數
filter
接受兩個參數,第一個參數是一個函數,第二個參數是一個可迭代對象。該函數會對可迭代對象中的每個元素都調用函數,并返回函數返回值為
True
的元素。
berries = list(filter(lambda f: '莓' in f, fruits))
print(berries)
方法四 生成器推導式
這個方法和列表推導式非常相像,但生成器的性能優勢,懂的都懂~~
berries = (f for f in fruits if '莓' in f)
print(berries)
# <generator object <genexpr> at 0x0000023495E96CF0>
for f in berries:
print(f)
# 草莓
# 藍莓
列表推導式需要預先計算所有結果并存儲在內存中,因此它會比生成器推導式消耗更多的內存。
當處理數據量非常大時,如果使用列表推導式可能會導致內存溢出或者程序運行緩慢。
而生成器推導式則可以在迭代過程中動態計算結果,從而減少內存使用和提高程序性能。
那我該怎么選呢?
方法一和方法二 適合數據量不大的處理,且代碼更易讀;
方法三和方法四 適合數據量較大的處理。