第7条:用列表推导式来取代map和filter
2024-09-02 11:27:13
核心知识点:
1.列表推导式要比内置的map和filter函数清晰,因为它无需额外编写lambda表达式。
2.列表推导式可以跳过输入列表中的某些元素,如果改用map来做,那就必须辅以filter方能实现。
3.字典与集也支持推导表达式。
Python提供了一套精炼的写法,可以根据一份列表里制作另外一份。这种表达式成为列表推倒式。
例如,要用列表中每个元素的平方值来创建另一份列表,可以这样实现:
>>> a = [1,2,3,4,5,6,7,8]
>>> squares = [x**2 for x in a]
>>> print(squares)
[1, 4, 9, 16, 25, 36, 49, 64]
除非是调用只有一个参数的函数,否则,对于简单的情况来说,列表推导要比内置的map函数更清晰。
如果使用map就要创建lambda函数,以便计算新列表中各个元素的值,这会使代码看上去比较乱。
>>> squares = map(lambda x:x**2,a)
>>> print(squares)
<map object at 0x0000029BC3251748>
>>> list(squares)
[1, 4, 9, 16, 25, 36, 49, 64]
列表推导式不像map那么复杂,可以直接过滤原列表中的元素,使得生成的新列表不会包含对应的计算结果。
例如,在计算平方值时,我们只想计算那些为2所整除的数。如果采用列表推导式,只需要在循环的后面添加条件表达式即可:
>>> even_squares = [x**2 for x in a if x%2 == 0]
>>> print(even_squares)
[4, 16, 36, 64]
把内置的filter函数与map结合起来,也能达成同样的效果,但代码会非常难懂。
>>> alt = map(lambda x:x**2,filter(lambda x:x%2 ==0,a))
>>> print(alt)
<map object at 0x0000029BC3251908>
>>> list(alt)
[4, 16, 36, 64]
字典(dict)与集(set)也有和列表类似的推到机制。例如:
>>> chile_ranks = {'kebi':1,'maoxian':2,'xiaoniao':3}
>>> rank_dict = {rank:name for name,rank in chile_ranks.items()}
>>> chile_len_set = {len(name) for name in rank_dict.values()}
>>> print(rank_dict)
{1: 'kebi', 2: 'maoxian', 3: 'xiaoniao'}
>>> print(chile_len_set)
{8, 4, 7}
关于filter和map的用法可以参考我的博客:http://www.cnblogs.com/yangmingxianshen/p/7764637.html
文章摘抄于Brett Slatkin的《编写高质量Python代码的59个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。
最新文章
- Oracle 11g DG配置简明版
- hbuilder的使用
- Linux中profile文件详解(转)
- matlab 调用dos命令和文件操作
- Android笔记:菜单
- Mysql 基本操作连接数据库读取信息内容
- poj-1469-COURSES-二分图匹配-匈牙利算法(模板)
- 文件夹IsShow字段为空
- Linux 在一个命令行上执行多个命令(转载)
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》 完结篇--源代码放送
- File 操纵目录
- 自行扩展 FineUIMvc 通知对话框(多个并排显示不重叠,支持最新的显示在最上方)
- 「mysql优化专题」优化之路高级进阶——表的设计及优化(6)
- 如何使用《DB 查询分析器》高效地生成旬报货运量数据
- 系统性能监测(使用nmon、nmonanalyser)
- spring security oauth2 jwt 认证和资源分离的配置文件(java类配置版)
- 【caffe】caffe在linux环境下的安装与编译
- cookie设置和清除,解决跨目录读取不到cookie值
- ASP.NET Core Web 项目 发布的IIS7提示“HTTP Error 502.5 - Process Failure
- 两条线段求交点+叉积求面积 poj 1408