欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python 函数 | filter 函数详解

程序员文章站 2022-06-22 16:25:45
博友们,你们好,很高兴能在这里和大家分享技术文章,我是 Amo Xiang,是一名在职企业员工,Amo 来源于上家公司的英文名,本意是 爱。作为刚入行几年互联网行业的小白,博主写博客一方面是为了记录自己的学习过程以及所犯的错误,更多的是希望能够帮助到很多处于起步阶段的萌新,让他们少走弯路。在编写文章时,参考了大量书籍及一些互联网大佬的资源,并结合了自己的工作经验,博主本着科学、严谨的态度、力求精益求精,但疏漏之处在所难免,敬请广大博友批评指正。博客主页:https://blog.csdn.net/xw16....

博友们,你们好,很高兴能在这里和大家分享技术文章,我是 Amo Xiang,是一名在职企业员工,Amo 来源于上家公司的英文名,本意是 。作为刚入行几年互联网行业的小白,博主写博客一方面是为了记录自己的学习过程以及所犯的错误,更多的是希望能够帮助到很多处于起步阶段的萌新,让他们少走弯路。在编写文章时,参考了大量书籍及一些互联网大佬的资源,并结合了自己的工作经验,博主本着科学、严谨的态度、力求精益求精,但疏漏之处在所难免,敬请广大博友批评指正。博客主页:https://blog.csdn.net/xw1680?spm=1011.2124.3001.5113

1. filter() 函数的介绍

1.1 功能

filter() 函数用于 过滤 可迭代对象中不符合条件的元素,返回由符合条件的元素组成的新的迭代器。filter() 函数把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False,来决定保留或丢弃该元素。

1.2 语法

filter(function or None, iterable) --> filter object

参数说明:

(1) function:用于实现判断的函数,可以为 None。
(2) iterable:可迭代对象,如列表、range 对象等。
(3) 返回值:返回一个迭代器对象。

2. filter() 函数的应用

2.1 filter() 函数的基本应用

使用 filter() 函数过滤出 0~100 (不包括 100) 之间的所有奇数,代码如下:

def is_odd_number(number):  # 定义一个判断偶数的函数
    # 第一种
    # if number % 2 != 0:
    #     return True
    # return False
    # 第二种
    # return True if number % 2 != 0 else False  # 简写
    # 第三种
    return number % 2 != 0  # 简写


new_list = filter(is_odd_number, range(100))  # 使用filter()函数过滤出序列中的偶数
print(new_list)  # 返回一个迭代器对象
print(list(new_list))  # 使用list()函数将迭代器转换为列表

程序运行结果如下:
Python 函数 | filter 函数详解

2.2 筛选指定范围的数据

定义学生列表,对 2020 年高考理科成绩进行筛选,获得成绩在 600 分到 700 分之间的学生信息,代码如下:

def find(item):  # 创建函数
    score = int(item[1])
    return True if 600 <= score < 700 else False  # 判断条件


list1 = [
    ("小明", 600), ("小刚", 601), ("小雅", 524),
    ("小旭", 714), ("小章", 624), ("小白", 635),
    ("小赵", 480), ("小高", 580), ("小王", 541), ("小琪", 680)
]
new_list = filter(find, list1)  # 过滤序列中不符合条件的元素
list2 = list(new_list)  # 使用list()函数转换为列表
print(list2)  # 输出学生列表
print(f"600分以上: {len(list2)} 人")

程序运行结果如下:
Python 函数 | filter 函数详解

2.3 筛选类型不是字符的元素

在一个集合中有一组数据,包括字符串、数字等,筛选出类型不是字符串的元素,代码如下:

a = {"AmoXiang", 123, 12.5, -2}
print(set(filter(lambda x: type(x) != str, a)))  # {123, 12.5, -2}

2.4 取出字符串中的数字并转换为整型

取出一组注册信息中的数字,然后转换为整数。首先判断字符串是否为数字,然后使用 filter() 函数过滤数字,最后转换为整型输出,代码如下:

a1 = "ISVO20N2WTRJ4T0XXGQ5QWP9Z"
a2 = filter(str.isdigit, a1)  # 过滤数字
a3 = list(a2)  # 转换为列表
num = "".join(a3)  # 连接列表
print(int(num))  # 转换为整型输出,输出: 2024059

2.5 去除序列中所有值为假的元素

如果将 filter() 函数的第一个参数 function 的值设置为 None,就会默认去除序列中所有值为假的元素,如 None、False、0、’’、()、[] 和 {}等,代码如下:

L = [1, '', 0, 'C', None, [0, 1, 2], False, 3.14, [], {'c': 1, 3: None}, {}]
f = filter(None, L)  # 去除序列中为假的元素
print(list(f))  # [1, 'C', [0, 1, 2], 3.14, {'c': 1, 3: None}]

2.6 获取序列中被删除的元素

filter() 函数的返回值是一个可迭代对象,利用 for 循环将返回数据与原始数据比较,就可以判断出哪些元素被删除了。代码如下:

L = [1, '', 0, 'C', None, [0, 1, 2], False, 3.14, [], {'c': 1, 3: None}, {}]
f = list(filter(None, L))
print(f)
delete_data = L
for i in f:
    if i in L:
        delete_data.remove(i)
print(f"被删除的元素为: {delete_data}")

2.7 获取索引中以索引为基数所对应的元素

通过 filter() 和 lambda() 函数输出列表 list_a 中以索引为基数出现次数最多的元素。代码如下:

list_a = [12, 213, 22, 2, 2, 2, 22, 2, 2, 32]
li = filter(lambda x: x in list_a, [i for i in range(len(list_a))])
print(list(li))  # [2]

2.8 判断是否已经收藏某课程

在线课堂项目中,用户可以收藏喜欢的课程。如果之前已经收藏过该课程,则不用收藏。所以每次收藏之前,需要查询该课程是否已经收藏。代码如下:

class Course(object):
    """
    课程类
    """

    def __init__(self, course_id):
        self.course_id = course_id


# 判断是否已经收藏
def is_favorite(course_id):
    # 获取所有收藏的课程 id
    course = list(filter(lambda c: c.course_id == course_id, course_list))
    if len(course) > 0:
        return True
    return


if __name__ == '__main__':
    course_list = []
    for i in range(1, 10):
        # 实例化9个课程类,并传递课程id
        course_list.append(Course(i))

    print(is_favorite(7))  # True
    print(is_favorite(10))  # None

感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


Python 函数 | filter 函数详解

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

本文地址:https://blog.csdn.net/xw1680/article/details/110849847