Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >如何使用Python的filter函数

如何使用Python的filter函数

作者头像
老齐
发布于 2020-11-04 08:10:23
发布于 2020-11-04 08:10:23
5K00
代码可运行
举报
文章被收录于专栏:老齐教室老齐教室
运行总次数:0
代码可运行

介绍

Python内置的filter()函数能够从可迭代对象(如字典、列表)中筛选某些元素,并生成一个新的迭代器。可迭代对象是一个可以被“遍历”的Python对象,也就是说,它将按顺序返回各元素,这样我们就可以在for循环中使用它。

filter()函数的基本语法是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(function, iterable)

返回一个可迭代的filter对象,可以使用list()函数将其转化为列表,这个列表包含过滤器对象中返回的所有的项。

filter()函数所提供的过滤方法,通常比用列表解析更有效,特别是当我们处理更大的数据集时。例如,列表解析会生成一个新列表,这会增加该处理的运行时间。当列表解析执行完毕它的表达式后,内存中会有两个列表。但是,filter()将生成一个简单的对象,该对象包含对原始列表的引用、提供的函数以及原始列表中位置的索引,这样操作占用的内存更少。

下面介绍filter()的四种不同用法:

filter()中使用特殊函数

filter()的第一个参数是一个函数,用它来决定第二个参数所引用的可迭代对象中的每一项的去留。此函数被调用后,当返回False时,第二个参数中的可迭代对象里面相应的值就会被删除。针对这个函数,可以是一个普通函数,也可以使用lambda函数,特别是当表达式不那么复杂的时候。

下面是filter()中使用lambda函数的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filter(lambda item: item[] expression, iterable)

将下面的列表,用于lambda函数,根据lambda函数表达式筛选列表中的元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']

要筛选此列表以元音开头的水族馆生物的名称,lambda函数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(list(filter(lambda x: x[0].lower() in 'aeiou', creature_names)))

在这里,我们将列表中的一个项声明为x,并以x[0]的方式访问每个字符串的第一个字符,并且要将字母转化为小写,以确保将字母与'aeiou'中的字符匹配。

最后,要提供可迭代对向creature_name。与上一节一样,用list()将返回结果转化为列表表。

输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['Ashley', 'Olly']

当然,写一个函数,也能够实现类似的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
creature_names = ['Sammy', 'Ashley', 'Jo', 'Olly', 'Jackie', 'Charlie']

def names_vowels(x):
    return x[0].lower() in 'aeiou'

filtered_names = filter(names_vowels, creature_names)

print(list(filtered_names))

names_vowels函数中用一个表达式,完成了对creature_names的过滤。

同样,输出如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['Ashley', 'Olly']

总的来说,在filter()函数中使用lambda函数得到的结果与使用常规函数得到的结果相同。如果所要过滤数据更复杂了,还可能要使用正则表达式,这可能会提高代码的可读性。

filter()中使用None

我们也可以将None作为filter()的第一个参数,让迭代器过滤掉Python中布尔值是False的对象,比如长度为0的对象(如空列表或空字符串)或在数字上等于0的对象。

下面的示例中要过滤一个列表,去掉其中布尔值是False的元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aquarium_tanks = [11, False, 18, 21, "", 12, 34, 0, [], {}]

filtered_tanks = filter(None, aquarium_tanks)

这段代码在filter()中使用了None,并将aquarium_tanks列表作为可迭代项传入。将None作为第一个参数,可以检查列表中的元素是否为False

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(list(filtered_tanks))

然后再将filtered_tanks传给list()函数,这样就得到了一个列表。

从输出结果中可以看出,我们得到了想要的整数,那些布尔值是False的项都筛选掉了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[11, 25, 18, 21, 12, 34]

注意:如果不使用list()并打印filtered_tanks,将得到一个类似于<filter object at 0x7fafd5903240>这样的filter对象。filter对象是可迭代的,因此我们可以使用for循环它,也可以使用list()将其转换为列表。

借助None,用filter()快速地从列表中删除被认为False的项。

filter()用于复杂场景

对于复杂的数据结构filter()也可以胜任,例如,有一个由字典组成的列表,我们不仅要遍历列表中的每项(字典), 还可能要遍历字典中的每个键值对,以便得到所有的数据。

举个例子,假设我们有水族馆里每种生物的一个列表以及每种生物的不同细节,用下面的列表显示此数据。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aquarium_creatures = [
  {"name": "sammy", "species": "shark", "tank number": "11", "type": "fish"},
  {"name": "ashley", "species": "crab", "tank number": "25", "type": "shellfish"},
  {"name": "jo", "species": "guppy", "tank number": "18", "type": "fish"},
  {"name": "jackie", "species": "lobster", "tank number": "21", "type": "shellfish"},
  {"name": "charlie", "species": "clownfish", "tank number": "12", "type": "fish"},
  {"name": "olly", "species": "green turtle", "tank number": "34", "type": "turtle"}
]

下面就写一个函数,用这个函数来过滤这些数据。为了让filter()访问每个字典和字典中的每个元素,这需要构造一个嵌套函数,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def filter_set(aquarium_creatures, search_string):
    def iterator_func(x):
        for v in x.values():
            if search_string in v:
                return True
        return False
    return filter(iterator_func, aquarium_creatures)

定义filter_set()函数,以aquarium_creaturessearch_string作为参数。在filter_set()中,将内部函数iterator_func()作为filter()的参数。filter_set()函数将返回由filter()生成的迭代器。

iterator_func()x作为参数,它代表列表中的一个项(即单个字典)。

接下来,for循环访问字典中每个键值对,然后使用条件语句检查search_string是键值对中的值。

iterator_func函数作为filter函数的参数对象,用它对迭代对象进行筛选。例如:用filter_set()搜索字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filtered_records = filter_set(aquarium_creatures, "2")

一旦函数执行完毕,过滤器对象存储filtered_records变量中,我们将其转换为一个列表并打印:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(list(filtered_records))

输出内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[{'name': 'ashley', 'species': 'crab', 'tank number': '25', 'type': 'shellfish'}, {'name': 'jackie', 'species': 'lobster', 'tank number': '21', 'type': 'shellfish'}, {'name': 'charlie', 'species': 'clownfish', 'tank number': '12', 'type': 'fish'}]

刚才的示例中,我们用filter()实现了在字典组成的列表中过滤制定字符。

结论

本文中列举了filter()函数的不同使用方法。如果你打算深入了解,请阅读《Python大学实用教程》(电子工业出版社)一书,这是针对零起点读者,并特别注重工程实践的不可多得的读物。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老齐教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python高级过滤器:掌握filter函数从入门到精通
在Python中,filter()是一个非常有用的内置函数,它能够根据指定的函数来筛选出可迭代对象中满足条件的元素,返回一个迭代器。filter()函数的使用能够简化代码,并提高程序的可读性。本文将从入门到精通,全面介绍filter()函数的用法和相关知识点。
子午Python
2023/08/01
4390
【Python内功心法】:深挖内置函数,释放语言潜能
Python 提供了许多内置函数,这些函数无需导入任何模块即可直接使用,极大地丰富了编程的便捷性。以下是一些常用的Python内置函数及其简要说明:
爱喝兽奶的熊孩子
2024/06/02
1570
【Python内功心法】:深挖内置函数,释放语言潜能
匿名函数、内置函数、面向过程编程
之前学到的函数都是有名函数,所谓匿名函数就是这类函数没有自己的函数名。他没有绑定名字,使用一次就被回收,加括号就可运行。
GH
2022/05/10
4140
Filter函数有哪些的高级用法
过滤是数据处理中的一项关键任务,而Python的filter函数是一种强大的工具,可以用于筛选序列中的元素。不仅可以用于基本的筛选操作,还可以实现复杂的条件过滤,以满足各种需求。本文将详细介绍filter函数的使用方法,并提供丰富的示例代码,帮助你深入理解如何利用它来处理数据。
阿珍
2024/06/19
1560
Filter函数有哪些的高级用法
Python中你不知道的迭代神器! 解锁Python的枚举魔法:enumerate函数深度剖析,告别手动计数,让Python循环与索引共舞
enumerate() 是 Python 中的一个内置函数,它用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。enumerate() 函数返回一个枚举对象,该对象是一个迭代器,它生成由 (index, value) 对组成的元组,其中 index 是从 start(默认为 0)开始计数的索引,value 是从输入的可迭代对象中获取的值。
小白的大数据之旅
2024/11/20
2.2K0
一行Python语句实现常用功能
深拷贝一个数据对象。因为python很多时候都是传引用,需要完整的复制一段数据的时候就需要深拷贝。
AIFEx
2023/09/23
2170
一行Python语句实现常用功能
40.python filter函数
filter函数主要用来筛选数据,过滤掉不符合条件的元素,并返回一个迭代器对象,如果要转换为列表list或者元祖tuple,可以使用内置函数list() 或者内置函数tuple()来转换;
猿说编程[Python和C]
2020/03/12
1K0
40.python filter函数
经验丰富程序员才知道的15种高级Python小技巧
不仅要按名字或年龄对其进行排序,还要将两个字段同时进行排序。在SQL中,会是这样的查询:
润森
2022/08/18
1.2K0
【Python篇】Python 函数综合指南——从基础到高阶
在 Python 中,函数是构建程序的一个重要部分,它允许你封装逻辑并高效地重用代码。函数是组织良好的、可重复使用的代码块,用于执行单一的、相关的操作。函数为的应用提供了更好的模块化能力,并提高了代码的重用性。
半截诗
2024/10/09
4300
Python 进阶之术 Map Filter Reduce
这是它的规范:规范 map(function_to_apply, list_of_inputs) ⼤多数时候,
Python知识大全
2020/02/21
4680
快收藏!!整理了100个Python小技巧!!
目前Python可以说是非常流行,在目前的编程语言中,Python的抽象程度是最高的,是最接近自然语言的,很容易上手。
Python数据科学
2021/07/16
9070
快收藏!!整理了100个Python小技巧!!
一文带你了解JavaScript 函数式编程
函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。
心莱科技雪雁
2019/08/23
1.1K0
一文带你了解JavaScript 函数式编程
一文带你了解JavaScript函数式编程?
函数式编程在前端已经成为了一个非常热门的话题。在最近几年里,我们看到非常多的应用程序代码库里大量使用着函数式编程思想。
猿哥
2019/08/09
5810
一文带你了解JavaScript函数式编程?
【Python常用函数】一文让你彻底掌握Python中的filter函数
只有把一个语言中的常用函数了如指掌了,才能在处理问题的过程中得心应手,快速地找到最优方案。
阿黎逸阳
2022/11/11
5290
【Java学习笔记之三十一】详解Java8 lambda表达式
Java 8 发布日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动。特性之一便是随同发布的lambda表达式,它将允许我们将行为传到函数里。在Java 8之前,如果想将行为传入函数,仅有的选择就是匿名类,需要6行代码。而定义行为最重要的那行代码,却混在中间不够突出。Lambda表达式取代了匿名类,取消了模板,允许用函数式风格编写代码。这样有时可读性更好,表达更清晰。在Java生态系统中,函数式表达与对面向对象的全面支持是个激动人心的进步。将进一步促进并行第三方库的发
Angel_Kitty
2018/04/09
1.5K0
Python全网最全基础课程笔记(十二)——函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
在Python中,函数是一段组织好的、可重复使用的、用来实现单一或相关联功能的代码块。它提高了代码的重用性、可读性和可维护性。你可以将函数想象成一个小型的程序,它接收输入(称为参数),执行一系列的操作,然后返回输出(如果有的话)。
小白的大数据之旅
2024/11/20
3420
Python全网最全基础课程笔记(十二)——函数,跟着思维导图和图文来学习,爆肝2w字,无数代码案例!
python-内置函数(搭配lambda使用)
目录 常用的内置函数 需要注意的知识点: enumerate()函数 map()函数 zip()函数 filter()函数 reduce()函数 sum()函数 max()/ min()函数 sort()函数 sorted()函数 内置函数一览表: 常用的内置函数 学习! 需要注意的知识点: 大部分内置函数经常搭配lambda函数使用 可迭代对象:字符串、列表、元组、字典、集合、文件对象 注意!!!! 在py3中部分函数的返回值是一个迭代器,不能多次遍历,(map、filter、z
HammerZe
2022/03/25
6890
python-内置函数(搭配lambda使用)
匿名函数
匿名函数通常与max()、min()、filter()、sorted()方法联用。
py3study
2020/01/16
5440
python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04
应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)   -->  l = [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, ]]]]]]]]]]]]]
suwanbin
2019/09/26
9780
python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04
Python高级编程技巧
正文: 本文展示一些高级的Python设计结构和它们的使用方法。在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求、对数据一致 性的要求或是对索引的要求等,同时也可以将各种数据结构合适地结合在一起,从而生成具有逻辑性并易于理解的数据模型。Python的数据结构从句法上来看 非常直观,并且提供了大量的可选操作。这篇指南尝试将大部分常用的数据结构知识放到一起,并且提供对其最佳用法的探讨。 推导式(Comprehensions) 如果你已经使用了很长时间的Python,那么你至少应该听说过列
小小科
2018/05/02
1.8K0
Python高级编程技巧
推荐阅读
相关推荐
Python高级过滤器:掌握filter函数从入门到精通
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验