Python之filter用法
原创大约 3 分钟
Python之filter用法
Python 的
filter()
函数用于过滤可迭代对象中的元素。它接收两个参数:一个函数和一个可迭代对象,并返回一个迭代器,该迭代器只包含函数返回值为True
的元素。以下是filter()
函数的详细用法和示例。
1. 基本用法
基本示例
def is_even(n):
return n % 2 == 0
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(is_even, numbers)
print(list(even_numbers)) # Output: [2, 4, 6]
2. 使用 lambda
表达式
使用 lambda
表达式可以简化代码。
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # Output: [2, 4, 6]
3. 过滤字符串
可以使用 filter()
来过滤字符串中的字符。
def is_vowel(char):
return char.lower() in 'aeiou'
sentence = "Hello World"
vowels = filter(is_vowel, sentence)
print(''.join(vowels)) # Output: 'eoo'
4. 过滤字典
可以使用 filter()
过滤字典中的键值对。
students = {
'Alice': 85,
'Bob': 75,
'Charlie': 95
}
passed_students = filter(lambda x: x[1] >= 80, students.items())
print(dict(passed_students)) # Output: {'Alice': 85, 'Charlie': 95}
5. 与其他高阶函数结合使用
filter()
可以与 map()
和 reduce()
结合使用。例如,首先过滤出偶数,然后对其平方。
from functools import reduce
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers)
squared_even_numbers = map(lambda x: x ** 2, even_numbers)
sum_of_squares = reduce(lambda x, y: x + y, squared_even_numbers)
print(sum_of_squares) # Output: 56 (4 + 16 + 36)
6. 过滤对象列表
可以使用 filter()
过滤对象列表。例如,过滤年龄大于 18 的人。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
people = [
Person('Alice', 17),
Person('Bob', 20),
Person('Charlie', 15),
Person('David', 25)
]
adults = filter(lambda person: person.age > 18, people)
print([person.name for person in adults]) # Output: ['Bob', 'David']
7. 结合条件
可以结合多个条件进行过滤。例如,过滤出既是偶数又大于 3 的数字。
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
filtered_numbers = filter(lambda x: x % 2 == 0 and x > 3, numbers)
print(list(filtered_numbers)) # Output: [4, 6, 8]
8. 处理嵌套结构
可以使用 filter()
处理嵌套结构。例如,过滤嵌套列表中包含特定元素的子列表。
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
filtered_list = filter(lambda x: 5 in x, nested_list)
print(list(filtered_list)) # Output: [[4, 5, 6]]
9. 处理生成器
filter()
函数返回一个迭代器,可以直接用于生成器表达式。
def is_positive(n):
return n > 0
numbers = range(-10, 10)
positive_numbers = (x for x in filter(is_positive, numbers))
print(list(positive_numbers)) # Output: [1, 2, 3, 4, 5, 6, 7, 8, 9]
注意事项
filter()
函数返回一个迭代器,包含可迭代对象中所有使函数返回True
的元素。- 第一个参数是一个函数,第二个参数是可迭代对象。
- 如果函数返回
False
,则该元素会被过滤掉。 - 如果函数参数为
None
,则默认使用bool
函数。
写在最后
filter()
函数非常强大,可以轻松实现各种过滤操作。结合lambda
表达式和其他高阶函数(如map()
和reduce()
),可以实现复杂的数据处理逻辑。使用filter()
可以显著简化代码,提高代码的可读性和可维护性。