千锋教育-做有情怀、有良心、有品质的职业教育机构

filter函数是Python内置的一个高阶函数,可以用于筛选序列中符合条件的元素,返回一个新的序列。它的基本用法是filter(function, iterable),其中function是一个函数,用于判断iterable中的每个元素是否符合条件,符合条件的元素将被保留下来,最后返回一个新的序列。

例如,我们可以使用filter函数来筛选出一个列表中所有的偶数:
_x000D_`python
_x000D_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_x000D_even_nums = list(filter(lambda x: x % 2 == 0, nums))
_x000D_print(even_nums) # 输出 [2, 4, 6, 8, 10]
_x000D_ _x000D_在上面的例子中,我们使用lambda表达式定义了一个函数,用于判断一个数是否为偶数。然后将这个函数作为第一个参数传递给filter函数,将列表nums作为第二个参数传递给filter函数,最后将filter函数的返回值转换为列表即可得到筛选后的结果。
_x000D_除了lambda表达式,我们还可以使用普通的函数来作为filter函数的第一个参数。例如,下面的代码演示了如何使用一个普通的函数来筛选出一个字符串列表中所有长度大于等于5的字符串:
_x000D_`python
_x000D_words = ['apple', 'banana', 'orange', 'pear', 'watermelon']
_x000D_def is_long_word(word):
_x000D_return len(word) >= 5
_x000D_long_words = list(filter(is_long_word, words))
_x000D_print(long_words) # 输出 ['apple', 'banana', 'orange', 'watermelon']
_x000D_ _x000D_在上面的代码中,我们定义了一个名为is_long_word的函数,用于判断一个字符串的长度是否大于等于5。然后将这个函数作为第一个参数传递给filter函数,将字符串列表words作为第二个参数传递给filter函数,最后将filter函数的返回值转换为列表即可得到筛选后的结果。
_x000D_除了基本用法之外,filter函数还有一些高级用法,下面我们来一一介绍。
_x000D_## 过滤None和空字符串
_x000D_在Python中,None和空字符串''都被视为False,因此我们可以使用filter函数来过滤掉列表中的None和空字符串。例如,下面的代码演示了如何使用filter函数来过滤掉一个列表中的None和空字符串:
_x000D_`python
_x000D_values = [1, None, '', 'hello', None, 3, 'world', '']
_x000D_filtered_values = list(filter(bool, values))
_x000D_print(filtered_values) # 输出 [1, 'hello', 3, 'world']
_x000D_ _x000D_在上面的代码中,我们将bool函数作为filter函数的第一个参数,bool函数用于将None和空字符串转换为False,将其他值转换为True。然后将列表values作为第二个参数传递给filter函数,最后将filter函数的返回值转换为列表即可得到筛选后的结果。
_x000D_## 过滤重复元素
_x000D_有时候我们需要从一个列表中过滤掉重复的元素,可以使用set函数来实现。例如,下面的代码演示了如何使用set函数来过滤掉一个列表中的重复元素:
_x000D_`python
_x000D_values = [1, 2, 3, 2, 1, 4, 5, 4, 3]
_x000D_unique_values = list(set(values))
_x000D_print(unique_values) # 输出 [1, 2, 3, 4, 5]
_x000D_ _x000D_在上面的代码中,我们先使用set函数将列表values转换为集合,这样就去掉了重复的元素。然后再将集合转换为列表即可得到筛选后的结果。
_x000D_## 过滤字典
_x000D_除了列表之外,我们还可以使用filter函数来过滤字典中的元素。例如,下面的代码演示了如何使用filter函数来过滤掉一个字典中所有值为None的键值对:
_x000D_`python
_x000D_data = {'name': 'Tom', 'age': None, 'gender': 'male', 'score': 90}
_x000D_filtered_data = dict(filter(lambda x: x[1] is not None, data.items()))
_x000D_print(filtered_data) # 输出 {'name': 'Tom', 'gender': 'male', 'score': 90}
_x000D_ _x000D_在上面的代码中,我们先使用items方法将字典data转换为一个由键值对组成的元组列表。然后使用lambda表达式定义一个函数,用于判断每个键值对的值是否为None。最后将这个函数作为filter函数的第一个参数,将字典data.items()作为第二个参数传递给filter函数,最后将filter函数的返回值转换为字典即可得到筛选后的结果。
_x000D_## 过滤文件
_x000D_我们还可以使用filter函数来过滤文件中的行。例如,下面的代码演示了如何使用filter函数来过滤掉一个文件中所有空行:
_x000D_`python
_x000D_with open('data', 'r') as f:
_x000D_lines = f.readlines()
_x000D_filtered_lines = list(filter(lambda x: x.strip() != '', lines))
_x000D_print(filtered_lines)
_x000D_ _x000D_在上面的代码中,我们使用with语句打开一个名为data的文件,并使用readlines方法读取所有行。然后使用lambda表达式定义一个函数,用于判断每行是否为空行。最后将这个函数作为filter函数的第一个参数,将文件中的所有行作为第二个参数传递给filter函数,最后将filter函数的返回值转换为列表即可得到筛选后的结果。
_x000D_## Q&A
_x000D_1. filter函数和map函数有什么区别?
_x000D_filter函数和map函数都是Python内置的高阶函数,但它们的作用不同。filter函数用于筛选序列中符合条件的元素,返回一个新的序列;而map函数用于对序列中的每个元素进行操作,返回一个新的序列。例如,我们可以使用filter函数来筛选出一个列表中所有的偶数,使用map函数来将列表中的每个元素都加上1:
_x000D_`python
_x000D_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_x000D_even_nums = list(filter(lambda x: x % 2 == 0, nums))
_x000D_print(even_nums) # 输出 [2, 4, 6, 8, 10]
_x000D_new_nums = list(map(lambda x: x + 1, nums))
_x000D_print(new_nums) # 输出 [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
_x000D_ _x000D_2. filter函数是否会改变原序列?
_x000D_不会。filter函数返回的是一个新的序列,原序列不会被改变。例如,下面的代码演示了使用filter函数筛选出一个列表中所有的偶数,但原列表并没有被改变:
_x000D_`python
_x000D_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_x000D_even_nums = list(filter(lambda x: x % 2 == 0, nums))
_x000D_print(even_nums) # 输出 [2, 4, 6, 8, 10]
_x000D_print(nums) # 输出 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_x000D_ _x000D_3. filter函数的第一个参数可以是什么类型?
_x000D_filter函数的第一个参数可以是一个函数或者一个可调用对象。如果第一个参数是一个函数,那么这个函数应该接受一个参数,并返回一个布尔值,用于判断序列中的每个元素是否符合条件。如果第一个参数是一个可调用对象,那么这个对象应该实现__call__方法,并接受一个参数,并返回一个布尔值,用于判断序列中的每个元素是否符合条件。例如,下面的代码演示了如何使用一个类来作为filter函数的第一个参数:
_x000D_`python
_x000D_class Even:
_x000D_def __call__(self, x):
_x000D_return x % 2 == 0
_x000D_nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_x000D_even_nums = list(filter(Even(), nums))
_x000D_print(even_nums) # 输出 [2, 4, 6, 8, 10]
_x000D_ _x000D_在上面的代码中,我们定义了一个名为Even的类,这个类实现了__call__方法,用于判断一个数是否为偶数。然后将这个类的实例作为filter函数的第一个参数,将列表nums作为第二个参数传递给filter函数,最后将filter函数的返回值转换为列表即可得到筛选后的结果。
_x000D_4. filter函数的第二个参数可以是什么类型?
_x000D_filter函数的第二个参数可以是一个序列,例如列表、元组、集合等。如果第二个参数是一个字典,那么filter函数将会对字典的键进行筛选。例如,下面的代码演示了如何使用filter函数来过滤掉一个字典中所有值为None的键值对:
_x000D_`python
_x000D_data = {'name': 'Tom', 'age': None, 'gender': 'male', 'score': 90}
_x000D_filtered_data = dict(filter(lambda x: x[1] is not None, data.items()))
_x000D_print(filtered_data) # 输出 {'name': 'Tom', 'gender': 'male', 'score': 90}
_x000D_ _x000D_在上面的代码中,我们先使用items方法将字典data转换为一个由键值对组成的元组列表。然后使用lambda表达式定义一个函数,用于判断每个键值对的值是否为None。最后将这个函数作为filter函数的第一个参数,将字典data.items()作为第二个参数传递给filter函数,最后将filter函数的返回值转换为字典即可得到筛选后的结果。
_x000D_
上一篇
digit在python中的用法下一篇
float在python中的含义
相关推荐