Python学习笔记——过滤序列元素

本文探讨了Python中处理序列的高效方法,包括使用列表推导、生成器表达式、filter函数进行数据过滤,以及利用itertools.compress进行高级筛选。通过实例展示了如何基于规则提取或转换序列元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

来源《python cookbook》第三版

问题:如果有序列,基于某些规则从中提取元素或者更改序列。

一、过滤数据

1.1 最简单的是基于列表推导

mylist = [1, 4, 3, -5, 0, -11, -9]
[n for n in mylist if n>0]    

缺陷在于如果列表非常大,会长生巨大的结果集占用大量内存。若果对内存敏感,使用生成器表达式迭代元素。

pos = (n for n in mylist if n>0)
for x in pos:
    print(x)

1.2 如果规则比较复杂,比如需要处理异常等,可以将代码放入函数中,内建filter()函数

values = ['1', '2', '-3', '-', '4', 'N/A', '5']
def is_int(val):
    try:
        x = int(val)
        return True
    except ValueError:
        return False
ivals = list(filter(is_int, values))
print(ivals)
# Outputs ['1', '2', '-3','4', '5']

二、过滤时添加转换

>>>L = ['helLLO', 'World', 18, 'applE', None]
>>>[s.lower() for s in L if isinstance(s, str)]
# Outputs ['helllo', 'world', 18, 'apple', None]

# 2
>>>[s.lower() if isinstance(s, str) else s for s in L]

在for循环中,如果if条件通过则执行s.lower(),否则else执行s(不做变化)

三、另一种值得关注的过滤工具itertools.compress()

>>>addresses = [
    '5412 N CLARK',
    '5148 N CLARK',
    '5800 E 58TH',
    '2122 N CLARK'
    '5645 N RAVENSWOOD',
    '1060 W ADDISON',
    '4801 N BROADWAY',
    '1039 W GRANVILLE',
]
>>>counts = [ 0, 3, 10, 4,1,7, 6, 1]

提取counts大于5的地址

>>>from itertools import compress
>>>more5 = [n > 5 forn in counts]
>>>more5
[False, False, True, False, False, True, True, False]
>>>list(compress(addresses, more5))
['5800 E 58TH', '4801 NBROADWAY', '1039 W GRANVILLE']
>>>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值