filter()
是一个内置函数,用于过滤可迭代对象(如列表、元组、字符串等)中的元素,根据指定的函数对每个元素进行判断,将满足条件的元素筛选出来,最终返回一个迭代器。
基本语法
filter(function, iterable)
参数详解
function
参数- 接受一个参数(来自
iterable
),返回布尔值。 - 若返回
True
,保留该元素;否则过滤掉。 - 如果
function
是None
,直接保留iterable
中布尔值为True
的元素。
- 接受一个参数(来自
iterable
参数- 可以是任何可迭代对象(列表、元组、字符串、生成器等)。
返回值
filter()
函数返回一个迭代器,该迭代器包含了 iterable
中所有使 function
返回 True
的元素。
使用示例
过滤列表中的偶数
# 定义一个判断偶数的函数
def is_even(num):
return num % 2 == 0
# 定义一个列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 使用 filter 函数过滤偶数
even_numbers = filter(is_even, numbers)
# 将迭代器转换为列表
result = list(even_numbers)
print(result) # 输出: [2, 4, 6, 8, 10]
在上述示例中,定义了一个 is_even
函数用于判断一个数是否为偶数,然后使用 filter()
函数将列表 numbers
中的偶数筛选出来,最后将迭代器转换为列表输出。
使用 lambda 函数过滤字符串中的元音字母
# 定义一个字符串
string = "hello world"
# 使用 lambda 函数过滤元音字母
vowels = 'aeiou'
filtered_chars = filter(lambda char: char.lower() in vowels, string)
# 将迭代器转换为字符串
result = ''.join(filtered_chars)
print(result) # 输出: 'eo o'
这里使用了 lambda
匿名函数来判断字符是否为元音字母,然后使用 filter()
函数将字符串 string
中的元音字母筛选出来,最后将迭代器转换为字符串输出。
过滤空字符串
# 定义一个包含空字符串的列表
strings = ["apple", "", "banana", " ", "cherry"]
# 使用 filter 函数过滤空字符串
non_empty_strings = filter(lambda s: s.strip(), strings)
# 将迭代器转换为列表
result = list(non_empty_strings)
print(result) # 输出: ['apple', 'banana', 'cherry']
在这个示例中,使用 lambda
函数和 strip()
方法判断字符串是否为空或只包含空白字符,然后使用 filter()
函数将非空字符串筛选出来。
当 function 为 None 时
# 定义一个包含不同类型元素的列表
mixed_list = [0, 1, False, True, '', 'hello', [], [1, 2]]
# 使用 filter 函数,function 为 None
filtered_list = filter(None, mixed_list)
# 将迭代器转换为列表
result = list(filtered_list)
print(result) # 输出: [1, True, 'hello', [1, 2]]
当 function
为 None
时,filter()
函数会返回 iterable
中所有布尔值为 True
的元素。
自定义过滤函数
def is_positive(n):
return n > 0
numbers = [-3, -2, 0, 5, 10]
filtered = filter(is_positive, numbers)
print(list(filtered)) # 输出: [5, 10]
过滤非字母数字字符(str.isalnum
)
text = "Hello, 世界! 123#"
# 过滤掉非字母、数字的字符(保留字母、数字、汉字等)
filtered = filter(str.isalnum, text)
clean_text = ''.join(filtered)
print(clean_text) # 输出: Hello世界123
仅保留字母(str.isalpha
)
text = "Python3.9 はパワフルです!"
filtered = filter(str.isalpha, text)
letters = ''.join(filtered)
print(letters) # 输出: Pythonはパワフルです
过滤非数字字符(str.isdigit
)
data = ["A1", "23", "45kg", "100"]
# 仅保留全数字字符串
filtered = filter(lambda s: s.isdigit(), data)
print(list(filtered)) # 输出: ['23', '100']
注意事项
- 返回的是迭代器:
filter()
函数返回的是一个迭代器,而不是一个列表或其他具体的数据结构。如果需要多次使用过滤后的结果,或者想要查看具体的元素,需要将迭代器转换为列表、元组等数据结构。 - 函数的返回值必须是布尔值:
function
函数的返回值必须是布尔值,用于指示元素是否满足过滤条件。 - 原可迭代对象不会被修改:
filter()
函数不会修改原可迭代对象,只是根据条件筛选出部分元素。
评论区