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中的一些高级编程技巧
Apr 02 Python
Python爬虫天气预报实例详解(小白入门)
Jan 24 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
python基础学习之如何对元组各个元素进行命名详解
Jul 12 Python
用Python实现读写锁的示例代码
Nov 05 Python
Python正则表达式和元字符详解
Nov 29 Python
如何在Django配置文件里配置session链接
Aug 06 Python
Python之Django自动实现html代码(下拉框,数据选择)
Mar 13 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
python实现简单文件读写函数
Feb 25 Python
总结几个非常实用的Python库
Jun 26 Python
Django基础CBV装饰器和中间件
Mar 22 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
PHP实现发送微博消息功能完整示例
2019/12/04 PHP
php7 参数、整形及字符串处理机制修改实例分析
2020/05/25 PHP
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
nodejs之请求路由概述
2014/07/05 NodeJs
jquery.idTabs 选项卡使用示例代码
2014/09/03 Javascript
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
将jquery.qqFace.js表情转换成微信的字符码
2017/12/01 jQuery
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[35:29]Secret vs VG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Python OpenCV对本地视频文件进行分帧保存的实例
2019/01/08 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
django 实现手动存储文件到model的FileField
2020/03/30 Python
Python中如何添加自定义模块
2020/06/09 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
BIBLOO捷克:购买女装、男装、童装、鞋和配件
2017/01/27 全球购物
综合实践活动总结
2014/05/05 职场文书
故宫导游词
2015/01/31 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
工程催款通知书
2015/04/17 职场文书
裁员通知
2015/04/25 职场文书
法定代表人身份证明书
2015/06/18 职场文书
入党后的感想
2015/08/10 职场文书
导游词之苏州盘门景区
2019/11/12 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
Java后台生成图片的完整步骤
2021/08/04 Java/Android
一定要知道的 25 个 Vue 技巧
2021/11/02 Vue.js
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js
Java服务调用RestTemplate与HttpClient的使用详解
2022/06/21 Java/Android