ZetCode

Python filter 函数

上次修改时间:2025 年 4 月 11 日

本综合指南探讨 Python 的 filter 函数,该函数基于谓词函数从可迭代对象中过滤元素。我们将介绍基本用法、lambda 函数、自定义谓词和实际示例。

基本定义

filter 函数从可迭代对象的元素中构造一个迭代器,其中函数返回 true。它是一个内置函数,支持 Python 中的函数式编程模式。

主要特点:接受一个函数和一个可迭代对象作为参数,返回一个 filter 对象(迭代器),并且只包含函数返回真值的元素。如果函数为 None,则会过滤掉虚假值。

基本 Filter 用法

这是一个使用不同数值类型的简单用法,展示了 filter 如何与基本谓词函数一起工作。

basic_filter.py
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 个字符的字符串。

lambda_filter.py
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 会从可迭代对象中删除所有虚假值。 此示例展示了此行为。

none_filter.py
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 和空列表。 仅保留真值。

这是一种通过删除空条目或无效条目来清理数据的简洁方法,而无需编写显式条件检查。

自定义对象过滤

您可以通过定义适当的谓词函数来过滤自定义对象。 此示例按价格和类别过滤产品。

object_filter.py
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。

chained_filter.py
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 都专注于一个特定条件。

最佳实践

资料来源

作者

我的名字是 Jan Bodnar,我是一位热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程