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

filter函数的用法python

来源:千锋教育
发布时间:2024-02-28 11:08:35
分享

千锋教育品牌logo

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

_x000D_

例如,我们可以使用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_
声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。

相关推荐

  • python dict是什么类型 Python dict是什么类型?_x000D_Python中的dict是一种非常常用的数据类型,也是一种非常强大的数据类型。它是一种可变的、无序的、键值对的集合类型。在Python中,dict被广
  • python count函数怎么用 **Python count函数怎么用**_x000D_Python是一种简单易学的编程语言,拥有丰富的内置函数,其中之一就是count函数。count函数用于统计字符串中某个子串出现的次数。我们将
  • python 16进制转10进制 Python是一种功能强大的编程语言,它提供了许多方便的工具和函数来处理不同的数据类型。其中,16进制转10进制是Python中常见的操作之一。本文将围绕着Python的16进制转10进制展开,介绍其
  • python 10进制转16进制 **Python 10进制转16进制:简单又实用**_x000D_Python是一种简单易学的编程语言,它提供了强大的功能和丰富的库,可以用来解决各种问题。其中一个常见的需求是将10进制数转换为16
  • print在python中的用法 print在Python中是一个非常常用的函数,用于将数据输出到控制台或者文件中。它的基本语法是print(value, ..., sep=' ', end='\n', file=sys.stdout
  • print在python中的意思 **print在Python中的意思**_x000D_print是Python编程语言中的一个关键字,用于将数据输出到控制台或者文件中。它是一种用于显示程序运行结果或者调试信息的常用方法。通过使用p