filter()用于条件筛选,需传入布尔函数和序列,返回迭代器,须转list/tuple才能重复使用;支持自定义函数、lambda及字典键值访问。

你需要在Python中用filter()函数对数据序列做条件筛选,比如从数字列表里挑出偶数、从字符串列表里提取含特定关键词的项、或从字典列表中选出满足字段条件的记录。
基础用法:用函数筛选数字列表
定义一个判断函数,传给filter(),再把结果转成列表即可。
第一步:写一个返回布尔值的函数,例如判断是否为正数:def is_positive(x): return x > 0。
第二步:调用filter(is_positive, [-2, -1, 0, 1, 2]),它会逐个把列表元素传入is_positive,只保留返回True的项。
第三步:用list()包裹结果,因为filter()默认返回迭代器,不转换就只能遍历一次——【不转成list或tuple,后续无法重复使用结果】。
快捷写法:用lambda表达式一行搞定
不需要单独定义函数时,直接用lambda更干净。
numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers)) → 输出[2, 4, 6]。
这比写完整函数少三行代码,适合逻辑简单、只用一次的场景。
过滤复杂结构:处理字典组成的列表
当数据是[{"name": "Alice", "age": 30}, {"name": "Bob", "age": 17}]这类结构时,lambda要明确访问键值。
方法一:筛选年龄小于20的人:minors = list(filter(lambda d: d["age"] 。
方法二:避免KeyError,加安全判断:filter(lambda d: d.get("age", 0) 。
注意:如果字典里可能缺失"age"键,直接写d["age"]会报错——【必须用.get()或in检查键存在性】。
特殊技巧:用None自动剔除假值
当你只想去掉空值(如0、""、None、[]、False),不用写函数,直接传None。
data = [0, 1, "", "hello", None, False, [], [1, 2]]
truthy_items = list(filter(None, data)) → 得到[1, 'hello', [1, 2]]。
这一步操作起来很简单,直接把None塞进第一个参数就行,但记住它只按Python的“真值”规则判断,不是按你主观认为的“空”来删。











