Python中的filter()-如何使用一个函数过滤序列元素?
filter()函数是Python内置函数之一,它用于过滤序列中不符合条件的元素,将符合条件的元素组成一个新的序列,并返回该序列。其基本语法如下:
filter(function, iterable)
其中,function为用来过滤序列元素的函数,iterable为待过滤的序列。function函数接收一个元素作为参数,并返回True或False,表示该元素是否应该被过滤掉,被过滤掉的元素就不会出现在返回的序列中。
接下来,我们通过一些示例来更好地了解filter()函数的使用方法。
### 示例一:过滤偶数
我们定义一个is_even函数,用于判断一个整数是否为偶数,然后使用filter()函数过滤掉列表lst中的所有奇数。
def is_even(x):
return x % 2 == 0
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = filter(is_even, lst) # 返回一个迭代器
print(list(result)) # [2, 4, 6, 8, 10]
在这个示例中,is_even()函数接收一个整数作为参数,返回True或False。我们把is_even()函数作为 个参数传给filter()函数,将列表lst作为第二个参数传递给filter()函数。filter()函数会遍历lst列表中的所有元素,并调用is_even()函数判断该元素是否为偶数。如果是偶数,则将这个元素加入到一个新的序列中,最后返回这个新的序列。
### 示例二:过滤空字符串
我们定义一个remove_empty函数,用于去除字符串中的空字符串,然后使用filter()函数过滤掉列表lst中的所有空字符串。
def remove_empty(s):
return s and s.strip()
lst = ['hello', '', ' ', 'world', ' ', '']
result = filter(remove_empty, lst) # 返回一个迭代器
print(list(result)) # ['hello', 'world']
在这个示例中,remove_empty()函数接收一个字符串作为参数,返回一个去除空字符串的新字符串。我们把remove_empty()函数作为 个参数传给filter()函数,将列表lst作为第二个参数传递给filter()函数。filter()函数会遍历lst列表中的所有元素,并调用remove_empty()函数去除空字符串。如果字符串不为空,则将其加入到一个新的序列中,最后返回这个新的序列。
### 示例三:过滤字典
我们定义一个is_age_above_20函数,用于判断一个字典中age字段的值是否大于20,然后使用filter()函数过滤掉字典列表lst中age字段的值小于等于20的元素。
def is_age_above_20(dct):
return dct['age'] > 20
lst = [{'name': 'Tom', 'age': 18},
{'name': 'Jerry', 'age': 22},
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 20},
{'name': 'Peter', 'age': 30}]
result = filter(is_age_above_20, lst) # 返回一个迭代器
print(list(result)) # [{'name': 'Jerry', 'age': 22}, {'name': 'Alice', 'age': 25}, {'name': 'Peter', 'age': 30}]
在这个示例中,is_age_above_20()函数接收一个字典作为参数,返回True或False。我们把is_age_above_20()函数作为 个参数传给filter()函数,将字典列表lst作为第二个参数传递给filter()函数。filter()函数会遍历lst列表中的所有元素,并调用is_age_above_20()函数判断age字段的值是否大于20。如果大于20,则将这个字典加入到一个新的序列中,最后返回这个新的序列。
最后,需要注意的是,filter()函数返回的是一个迭代器,而不是一个列表,需要使用list()函数将其转换成列表才能输出。
