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)
# 草莓
# 蓝莓
列表推导式需要预先计算所有结果并存储在内存中,因此它会比生成器推导式消耗更多的内存。
当处理数据量非常大时,如果使用列表推导式可能会导致内存溢出或者程序运行缓慢。
而生成器推导式则可以在迭代过程中动态计算结果,从而减少内存使用和提高程序性能。
那我该怎么选呢?
方法一和方法二 适合数据量不大的处理,且代码更易读;
方法三和方法四 适合数据量较大的处理。