Python filter 函数
上次修改时间:2025 年 4 月 11 日
本综合指南探讨 Python 的 filter
函数,该函数基于谓词函数从可迭代对象中过滤元素。我们将介绍基本用法、lambda 函数、自定义谓词和实际示例。
基本定义
filter
函数从可迭代对象的元素中构造一个迭代器,其中函数返回 true。它是一个内置函数,支持 Python 中的函数式编程模式。
主要特点:接受一个函数和一个可迭代对象作为参数,返回一个 filter 对象(迭代器),并且只包含函数返回真值的元素。如果函数为 None,则会过滤掉虚假值。
基本 Filter 用法
这是一个使用不同数值类型的简单用法,展示了 filter
如何与基本谓词函数一起工作。
def is_even(n): return n % 2 == 0 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] filtered = filter(is_even, numbers) print(list(filtered)) # [2, 4, 6, 8, 10]
此示例展示了带有简单谓词函数的 filter
,该函数检查偶数。 filter 对象被转换为列表以进行显示。
is_even
函数对偶数返回 True,因此只有原始列表中的偶数包含在结果中。
使用 Lambda 函数进行 Filter
Lambda 函数通常与 filter
一起使用,用于简洁的一次性谓词。 此示例过滤长度超过 5 个字符的字符串。
words = ["apple", "banana", "cherry", "date", "elderberry"] long_words = filter(lambda x: len(x) > 5, words) print(list(long_words)) # ['banana', 'cherry', 'elderberry']
Lambda 函数检查每个单词的长度。只有长度超过 5 个字符的单词才能通过 filter。这演示了内联谓词的用法。
对于定义单独函数是不必要的简单条件,Lambdas 是理想的选择。 对于基本 filter,语法紧凑且可读。
过滤 None 值
当 None 作为函数参数传递时,filter
会从可迭代对象中删除所有虚假值。 此示例展示了此行为。
mixed_values = [0, 1, False, True, "", "hello", None, [], [1,2,3]] truthy_values = filter(None, mixed_values) print(list(truthy_values)) # [1, True, 'hello', [1, 2, 3]]
使用 None
作为函数,filter 删除所有虚假值:0、False、空字符串、None 和空列表。 仅保留真值。
这是一种通过删除空条目或无效条目来清理数据的简洁方法,而无需编写显式条件检查。
自定义对象过滤
您可以通过定义适当的谓词函数来过滤自定义对象。 此示例按价格和类别过滤产品。
class Product: def __init__(self, name, price, category): self.name = name self.price = price self.category = category def __repr__(self): return f"{self.name} (${self.price})" products = [ Product("Laptop", 999, "Electronics"), Product("Shirt", 29, "Clothing"), Product("Phone", 699, "Electronics"), Product("Pants", 49, "Clothing"), Product("Tablet", 299, "Electronics") ] affordable_electronics = filter( lambda p: p.price < 500 and p.category == "Electronics", products ) print(list(affordable_electronics)) # [Tablet ($299)]
Lambda 函数检查价格和类别属性。 只有满足两个条件的产品才会包含在过滤后的结果中。
这演示了 filter
如何处理自定义对象的复杂条件,使其可用于数据处理应用程序。
链接 Filter 操作
可以链接 Filter 操作以实现更复杂的过滤逻辑。 此示例显示了按顺序应用的多个 filter。
numbers = range(1, 101) # Filter multiples of 3 multiples_of_3 = filter(lambda x: x % 3 == 0, numbers) # From those, filter numbers ending with 0 result = filter(lambda x: str(x).endswith('0'), multiples_of_3) print(list(result)) # [30, 60, 90]
第一个 filter 从 1 到 100 中选择 3 的倍数。然后,第二个 filter 从此结果中选择以 0 结尾的数字。仅包含满足这两个条件的数字。
通过将复杂过滤逻辑分解为简单步骤,链接 filter 可以使复杂过滤逻辑更具可读性。 每个 filter 都专注于一个特定条件。
最佳实践
- 用于清晰性: 当意图明确是选择元素时,首选 filter
- 与 map 结合使用: 通常与 map 一起用于数据管道
- 考虑推导式: 对于简单的情况,列表推导式可能更具可读性
- 记录谓词: 清楚地记录复杂的 filter 条件
- 处理内存: 请注意,filter 返回一个迭代器,而不是一个列表
资料来源
作者
列出所有 Python 教程。