[PY3]——过滤数据——列表推导、filter()、itertools.compress()
解决方案
最简单的过滤数据的方法,就是使用列表推导。
使用列表推导的一个潜在缺陷就是如果输入非常大的时候会产生一个非常大的结果集,对内存敏感时可以考虑使用生成器表达式迭代产生过滤元素
在过滤规则比较复杂不便于用简单的列表推导就写出来的情况下,这时可以考虑写成将规则写成一个函数,然后使用内建的 filter()
函数
还有过滤工具 itertools.compress()
列表推导
lst=[1,4,-5,10,-7,2,3,-1] print([n for n in lst if n>0]) [1, 4, 10, 2, 3] #若考虑内存占用情况,则: result=[n for n in lst if n>0] for x in result: print(x) 1 4 10 2 3
filter(函数,序列)
filter()
接收一个函数和一个序列。
filter()会
把传入的函数依次作用于每个元素,然后根据返回值是True
还是False
决定保留还是丢弃该元素。
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) ['1', '2', '-3', '4', '5'] # 用filter()删除1~100的素数
itertools.compress(data,selectors)
compress
可用于对数据进行筛选,当 selectors 的某个元素为 true 时,则保留 data 对应位置的元素,否则去除
from itertools import compress print(list(compress("ABCDEF",[1,0,1,0,1,1]))) ['A', 'C', 'E', 'F'] print(list(compress("ABCDEF",[True,False,True,False,True,True]))) ['A', 'C', 'E', 'F'] 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] print(list(compress(addresses,[n>5 for n in counts]))) ['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']
过滤数据时转换数据
import math print([math.sqrt(n) for n in lst if n>0]) [1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]
过滤数据时替换数据
print([n if n>0 else 0 for n in lst]) [1, 4, 0, 10, 0, 2, 3, 0] print([n if n<0 else '-' for n in lst]) ['-', '-', -5, '-', -7, '-', '-', -1]
参考文章
分类:
Python/奇技淫巧
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· 为DeepSeek添加本地知识库
· 精选4款基于.NET开源、功能强大的通讯调试工具
· DeepSeek智能编程
· 大模型工具KTransformer的安装
· [计算机/硬件/GPU] 显卡