过滤序列元素
1. 有一个数据序列,想提取出需要的值或者是缩短序列,最简单的方式就是使用列表推导
mylist = [1, 4, -5, 10, -7, 2, 3, -1] print([n for n in mylist if n < 10]) #[1, 4, -5, -7, 2, 3, -1]
- 缺陷就是结果集非常大时会长用大量的内存
2.那么就可以使用生成器表达式迭代产生过滤的元素
pos = (n for n in mylist if n>0) print(pos) #<generator object <genexpr> at 0x000001CEF6564048> for x in pos: print(x) #1 4 1 0 2 3
- filter() 函数创建了一个迭代器,因此如果想得到一个列表的话,就得使用 list()去转换。
values = ['1', '2', '-3', '-', '4', 'N/A','5'] import math def is_int(val): try: x = int(val) return True except ValueError: return False ivals = list(filter(is_int,values)) float_num = [] for num in ivals: float_num.append(float(num)) print(float_num) #[1.0, 2.0, -3.0, 4.0, 5.0]
3. 在过滤数据的时候还可以转换数据
mylist = [1, 4, -5, 10, -7, 2, 3, -1] import math print([math.sqrt(n) for n in mylist if n > 0 ]) ##[1.0, 2.0, 3.1622776601683795, 1.4142135623730951, 1.7320508075688772]
- 在过滤操作时,想用指定的数据去代替过滤的值
mylist = [1, 4, -5, 10, -7, 2, 3, -1] zeng = [n if n > 0 else 0 for n in mylist] print(zeng)#[1, 4, 0, 10, 0, 2, 3, 0]
- 当你想过滤掉两个相关联的数据时,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的全部地址
cheng = [n > 5 for n in counts] #大于5的输出是True,小于5的输出False print(cheng) #[False, False, True, False, False, True, True, False] from itertools import compress more = list(compress(addresses,cheng)) #compress() 函数根据这个序列去选择输出对应位置为 True 的元素 print(more) #['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']
微笑向暖安之若素,你若盛开清风自来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?