Python中的推导式使用详解


Posted in Python onJune 03, 2015

推导式是Python中很强大的、很受欢迎的特性,具有语言简洁,速度快等优点。推导式包括:

1.列表推导式
2.字典推导式
3.集合推导式

嵌套列表推导式

NOTE: 字典和集合推导是最近才加入到Python的(Python 2.7 和Python 3.1以上版). 下面简要介绍下:

【列表推导式】

列表推导能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形
其基本格式如下:

[expr for value in collection ifcondition]

过滤条件可有可无,取决于实际应用,只留下表达式;相当于下面这段for循环:
result = []  

for value in collection:  

    if condition:  

        result.append(expression) 

例1:  过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith']  

  

>>> [name.upper() for name in names if len(name)>3]  

['ALICE', 'JERRY', 'WENDY', 'SMITH'] 

例2:  求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
>>> [(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]  

[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]

例3:  求M中3,6,9组成的列表
>>> M = [[1,2,3],

...      [4,5,6],

...      [7,8,9]]

>>> M  

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

>>> [row[2] for row in M]  

[3, 6, 9] 
#或者用下面的方式  

>>> [M[row][2] for row in (0,1,2)]  

[3, 6, 9] 

例4:  求M中斜线1,5,9组成的列表
>>> M  

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

>>> [M[i][i] for i in range(len(M))]  

[1, 5, 9] 

例5:  求M,N中矩阵和元素的乘积
>>> M = [[1,2,3],  

...      [4,5,6],  

...      [7,8,9]]  

>>> N = [[2,2,2],  

...      [3,3,3],  

...      [4,4,4]]  

>>> [M[row][col]*N[row][col] for row in range(3) for col in range(3)]  

[2, 4, 6, 12, 15, 18, 28, 32, 36]  

>>> [[M[row][col]*N[row][col] for col in range(3)] for row in range(3)]  

[[2, 4, 6], [12, 15, 18], [28, 32, 36]]  

>>> [[M[row][col]*N[row][col] for row in range(3)] for col in range(3)]  

[[2, 12, 28], [4, 15, 32], [6, 18, 36]] 

例5:  讲字典中age键,按照条件赋新值
>>> bob  

{'pay': 3000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'}  

>>> sue  

{'pay': 4000, 'job': 'hdw', 'age': 45, 'name': 'Sue Jones'}  

>>> people = [bob, sue]  

>>> [rec['age']+100 if rec['age'] >= 45 else rec['age'] for rec in people]  # 注意for位置  

[42, 145] 

【字典推导式】

字典和集合推导式是该思想的延续,语法差不多,只不过产生的是集合和字典而已。其基本格式如下:

{ key_expr: value_expr for value in collection if condition }

例1:  用字典推导式以字符串以及其长度建字典
>>> strings = ['import','is','with','if','file','exception']  

  

>>> D = {key: val for val,key in enumerate(strings)}  

  

>>> D  

{'exception': 5, 'is': 1, 'file': 4, 'import': 0, 'with': 2, 'if': 3} 

【集合推导式】
集合推导式跟列表推导式非常相似,唯一区别在于用{}代替[]。其基本格式如下:
{ expr for value in collection if condition }

例1:  用集合推导建字符串长度的集合
>>> strings = ['a','is','with','if','file','exception']  

>>> {len(s) for s in strings}    #有长度相同的会只留一个,这在实际上也非常有用  

set([1, 2, 4, 9]) 

【嵌套列表推导式】
嵌套列表是指列表中嵌套列表,比如说:
>>> L = [[1,2,3],  

         [4,5,6],  

         [7,8,9]] 

例1: 一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上字母e的姓名,组成列表
names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],  

         ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']] 

用for循环实现:
tmp = []  

for lst in names:  

    for name in lst:  

        if name.count('e') >= 2:  

            tmp.append(name)  

  

print tmp  

#输出结果  

>>>   

['Jefferson', 'Wesley', 'Steven', 'Jennifer'] 

用嵌套列表实现:
>>> names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'],  

         ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]  

  

>>> [name for lst in names for name in lst if name.count('e')>=2]  #注意遍历顺序,这是实现的关键  

['Jefferson', 'Wesley', 'Steven', 'Jennifer'] 
Python 相关文章推荐
python使用htmllib分析网页内容的方法
May 08 Python
Python操作列表之List.insert()方法的使用
May 20 Python
wxPython定时器wx.Timer简单应用实例
Jun 03 Python
Pycharm学习教程(2) 代码风格
May 02 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
Python中property函数用法实例分析
Jun 04 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
浅谈Python traceback的优雅处理
Aug 31 Python
Python递归求出列表(包括列表中的子列表)的最大值实例
Feb 27 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
Aug 18 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
python tkinter实现定时关机
Apr 21 Python
对于Python装饰器使用的一些建议
Jun 03 #Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 #Python
Python使用ftplib实现简易FTP客户端的方法
Jun 03 #Python
Python中的深拷贝和浅拷贝详解
Jun 03 #Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 #Python
python处理二进制数据的方法
Jun 03 #Python
Python读写配置文件的方法
Jun 03 #Python
You might like
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
uploadify 3.0 详细使用说明
2012/06/18 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
教你如何使用firebug调试功能了解javascript闭包和this
2015/03/04 Javascript
js实现3D图片逐张轮播幻灯片特效代码分享
2015/09/09 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
nodejs搭建本地http服务器教程
2017/03/13 NodeJs
javascript代码优化的8点总结
2018/01/29 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
jupyter notebook读取/导出文件/图片实例
2020/04/16 Python
Python如何对齐字符串
2020/07/30 Python
Pycharm2020.1安装无法启动问题即设置中文插件的方法
2020/08/07 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
python调用百度AI接口实现人流量统计
2021/02/03 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
Intimissimi德国网上商店:意大利知名内衣品牌
2018/04/03 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
装潢设计专业推荐信模板
2013/11/26 职场文书
班组长安全生产职责
2013/12/16 职场文书
房地产销售计划书
2014/01/10 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
韩语专业职业生涯规划范文:成功之路就在我们脚下
2014/09/11 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
门卫管理制度范本
2015/08/05 职场文书
MySQL系列之九 mysql查询缓存及索引
2021/07/02 MySQL
Python 数据可视化之Matplotlib详解
2021/11/02 Python
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers