HOWTO · Python

Python 中的 filter() 内置函数和 Lambda 函数

了解 Python 中的 filter() 内置函数和 lambda 函数。

本页内容

使用 Python 内置的 filter() 函数和 lambda 谓词,可以从可迭代对象中筛选出符合条件的值。本指南将介绍谓词如何求值、filter() 为何会返回迭代器,以及如何将筛选结果转换为列表。同样的写法也适用于数值阈值、奇偶判断、字符串长度和范围筛选。

filter() 和 lambda 的工作原理

filter() 是内置函数,不是方法。它接受两个参数:一个谓词函数,以及一个可迭代对象,例如列表或元组。Python 会依次将每个元素传给谓词;如果谓词的结果为真值,filter() 就会产出该元素。谓词可以返回任何能由 Python 检验真值的值;不过,返回布尔表达式会让意图更清晰。

lambda 表达式会创建一个简短的匿名函数。参数写在冒号前,后面跟一个表达式。例如,lambda value: value <= 20 接收一个值,并返回该值是否不大于 20。如果条件需要多条语句,或需要一个便于复用且含义明确的名称,也可以使用命名函数作为谓词。

filter() 的结果是惰性迭代器(一个 filter 对象),而不是列表。如果需要显示、按索引访问或重复使用所有筛选结果,可以用 list() 将其转换为列表;如果元组更合适,也可以用 tuple()。迭代器会在读取时逐步消耗,因此如果要多次遍历匹配项,应转换一次并保留生成的集合。

使用 filter() 和 lambda 函数

这个示例会保留小于或等于 20 的整数,并将迭代器转换为列表,以便同时打印原始输入和筛选结果。示例已成功运行,输出展示了输入值和筛选后的值。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

values = [11, 23, 13, 4, 15, 66, 7, 8, 99, 10]
selected = list(filter(lambda value: value <= 20, values))
print("Input:", values)
print("Selected:", selected)
Input: [11, 23, 13, 4, 15, 66, 7, 8, 99, 10]
Selected: [11, 13, 4, 15, 7, 8, 10]

示例:筛选数字和字符串

下面的每个示例都是完整的 Python 代码片段。四个示例均已成功运行;显示的输出展示了各个谓词保留的值。

从列表中筛选偶数

偶数除以 2 的余数为零:

本节中的代码以及显示的标签或输出仍为英文。

values = [1, 2, 3, 4, 5, 66, 77, 88, 99, 100]
even_values = list(filter(lambda value: value % 2 == 0, values))
print("Input:", values)
print("Even:", even_values)
Input: [1, 2, 3, 4, 5, 66, 77, 88, 99, 100]
Even: [2, 4, 66, 88, 100]

从列表中筛选奇数

对于列表中的正整数,余数为 1 的数是奇数:

values = [1, 2, 3, 4, 5, 66, 77, 88, 99, 100]
odd_values = list(filter(lambda value: value % 2 == 1, values))
print("Input:", values)
print("Odd:", odd_values)
Input: [1, 2, 3, 4, 5, 66, 77, 88, 99, 100]
Odd: [1, 3, 5, 77, 99]

按长度筛选字符串

len() 会返回每个字符串的字符数,因此这个谓词会保留长度为五个字符的字符串:

words = ["hello", "python", "world", "walking", "sleep", "shelter", "food"]
five_character_words = list(filter(lambda word: len(word) == 5, words))
print("Input:", words)
print("Selected:", five_character_words)
Input: ['hello', 'python', 'world', 'walking', 'sleep', 'shelter', 'food']
Selected: ['hello', 'world', 'sleep']

筛选指定闭区间内的数字

链式比较会同时包含两个端点:10 和 20。

values = [11, 23, 13, 4, 15, 66, 7, 8, 99, 10]
in_range = list(filter(lambda value: 10 <= value <= 20, values))
print("Input:", values)
print("In range:", in_range)
Input: [11, 23, 13, 4, 15, 66, 7, 8, 99, 10]
In range: [11, 13, 15, 10]

如需了解如何检查变量是否为 None,请参阅“在 Python 中检查变量是否为 None”。如需提取子数组,请参阅“在 Python 中获取数组的子数组”。