欢迎访问宙启技术站
智能推送

如何使用Python函数filter()根据条件过滤列表中的元素?

发布时间:2023-06-01 19:08:17

Python是一种非常流行的编程语言,它具有简单易用、开放源代码、跨平台等多种优点,因此被广泛应用于各种领域。在Python中,函数filter()是一个非常有用的工具,可以帮助我们根据自定义的条件过滤列表中的元素,从而得到符合要求的子集。本文将介绍如何使用Python函数filter()根据条件过滤列表中的元素,帮助读者更好地理解其工作原理和实现方式。

1.函数filter()的基本介绍

函数filter()是Python内置的一个高阶函数,其作用是从一个序列中过滤出符合条件的元素,然后返回一个生成器对象。函数的定义如下所示:

filter(function, iterable)

其中,function是一个函数对象,用于对传入的iterable对象进行筛选;iterable是一个可迭代对象,即可以被for循环遍历的对象,如列表、元组、字典、集合等。函数filter()的返回值是一个迭代器对象,可以根据需要转化为列表、元组等其他类型容器。

2.使用函数filter()过滤列表中的元素

在使用函数filter()过滤列表中的元素之前,需要了解一下在Python中定义函数的基本方法。在Python中,可以使用def语句来定义一个函数,其语法结构如下:

def function_name(parameters):

    """

    function_docstring

    """

    function_body

其中,function_name是该函数的名称,parameters是该函数的参数列表,可选项可以为空或单个参数或多个参数;function_docstring是函数的描述信息,可选项,用于提供函数说明文档;function_body是函数的主要执行代码块,由一个或多个语句组成。

现在,我们考虑一个具体的例子,针对给定的整数列表,过滤出其中所有的奇数元素,然后返回一个新的列表,可以使用函数filter()来实现。具体的代码实现如下所示:

def is_odd(x):

    """

    判断给定数字是否为奇数

    """

    return x % 2 == 1

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

filter_obj = filter(is_odd, lst)

new_lst = list(filter_obj)

print(new_lst)  # [1, 3, 5, 7, 9]

上述代码中,我们首先定义了一个函数is_odd(),用于判断给定数字是否为奇数,如果是就返回True,否则返回False。然后,我们创建一个整数列表lst,使用函数filter()来过滤其中奇数元素,并将结果保存到一个迭代器对象filter_obj中。最后,我们使用list()函数将filter_obj转换为一个列表对象new_lst,并输出结果。

除了使用函数定义来过滤列表中的元素外,还可以使用lambda函数来实现同样的功能。lambda函数是一种匿名函数,也称为速写函数,可以临时定义一个简单函数,从而简化代码,提高代码可读性。示例代码如下所示:

lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

new_lst = list(filter(lambda x: x % 2 == 1, lst))

print(new_lst)  # [1, 3, 5, 7, 9]

相比于前面的代码,我们使用lambda函数替代了定义is_odd()函数的方式,从而更加简洁明了。需要注意的是,lambda函数的语法结构为lambda parameters: expression,其中parameters是函数参数列表,而expression是函数执行体,只能包含一个表达式。

3.使用函数filter()过滤字典中的元素

除了可以用函数filter()过滤列表中的元素外,还可以用它来过滤字典的元素。与列表不同的是,字典是一种可迭代对象,其元素为键值对,因此需要对其每个键值对进行筛选,从而构建一个新的字典。示例代码如下所示:

def above_age(name_age_dict, threshold):

    """

    判断指定姓名对应的年龄是否大于指定阈值

    """

    return name_age_dict[1] > threshold

person_dict = {'Lucy': 18, 'Mike': 25, 'Jack': 30, 'Sarah': 20}

new_person_dict = dict(filter(lambda x: above_age(x, 22), person_dict.items()))

print(new_person_dict)  # {'Mike': 25, 'Jack': 30}

上述代码中,我们首先定义了一个函数above_age(),用于判断指定姓名对应的年龄是否大于指定阈值。然后,我们创建了一个字典person_dict,其中键为人名,值为年龄。接着,我们使用字典的items()方法将其转换为可迭代对象,然后使用lambda函数和filter()函数根据指定的条件过滤其中的元素,并将过滤后的结果保存到一个新的字典new_person_dict中。

需要注意的是,字典其实是由键值对组成的一种映射关系,而进行过滤操作时需要考虑到两个方面,即筛选的是字典的键还是值,以及过滤的是键值对还是键或值。在上述代码中,我们是根据指定的阈值过滤出年龄大于该阈值的人名和年龄,因此要根据键值对的值进行筛选。如果要根据键来筛选,可以使用字典的keys()方法,如果要根据值来筛选,则需要使用字典的values()方法。

4.使用函数filter()的高级应用

函数filter()是一种非常强大的工具,不仅可以用来过滤列表和字典等标准数据类型,还可以用来处理一些非标准类型,如自定义对象、数据库查询结果等。下面,我们来看一些使用函数filter()的高级应用场景。

4.1 过滤自定义对象中的元素

在Python中,我们可以通过定义类来创建自定义对象,每个对象包含若干个属性和方法,可以在程序中进行使用。如果要使用函数filter()过滤自定义对象中的元素,需要满足以下两个条件:首先,该对象需要是可迭代对象,可以进行for循环遍历;其次,该对象的属性或方法需要支持传入筛选条件,即在函数定义中使用合适的参数进行处理。

示例代码如下所示:

class Person:

    def __init__(self, name, age, gender):

        self.name = name

        self.age = age

        self.gender = gender

person_lst = [Person('Lucy', 18, 'female'),

              Person('Mike', 25, 'male'),

              Person('Jack', 30, 'male'),

              Person('Sarah', 20, 'female')]

# 根据姓名首字母过滤人员名单

new_person_lst = list(filter(lambda x: x.name[0] in ['M', 'S'], person_lst))

for p in new_person_lst:

    print(p.name, p.age, p.gender)

上述代码中,我们首先定义了一个类Person,其中包含name、age、gender三个属性,用于存储人员的姓名、年龄、性别等信息。然后,我们创建了一个Person对象列表person_lst,其中包含了若干个对象的信息。接着,我们使用lambda函数和filter()函数根据指定条件过滤其中的元素,并将过滤后的结果保存到一个新的列表new_person_list中,最后输出结果。

需要注意的是,在上述代码中,我们