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文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
python实现挑选出来100以内的质数
Mar 24 Python
Python正则表达式匹配HTML页面编码
Apr 08 Python
在Python中进行自动化单元测试的教程
Apr 15 Python
Python制作简易注册登录系统
Dec 15 Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
详解python函数传参是传值还是传引用
Jan 16 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
浅谈flask源码之请求过程
Jul 26 Python
python  logging日志打印过程解析
Oct 22 Python
python搜索算法原理及实例讲解
Nov 18 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设计模式 Mediator (中介者模式)
2011/06/26 PHP
php定时执行任务设置详解
2015/02/06 PHP
php中ob_flush函数和flush函数用法分析
2015/03/18 PHP
PHP7匿名类用法分析
2016/09/26 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
pjblog修改技巧汇总
2007/03/12 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
JavaScript中setTimeout的那些事儿
2016/11/14 Javascript
Ajax 加载数据 练习代码
2017/01/05 Javascript
原生JS实现圣旨卷轴展开效果
2017/03/06 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
vue实现动态显示与隐藏底部导航的方法分析
2019/02/11 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
2020/02/10 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
Python字符串替换实例分析
2015/05/11 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
2016/12/18 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python分块读取大数据,避免内存不足的方法
2018/12/10 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
使用Python刷淘宝喵币(低阶入门版)
2019/10/30 Python
Python基于class()实现面向对象原理详解
2020/03/26 Python
Python内置函数property()如何使用
2020/09/01 Python
python中操作文件的模块的方法总结
2021/02/04 Python
css3 伪元素和伪类选择器详解
2014/09/04 HTML / CSS
英国二手iPhone、音乐、电影和游戏商店:musicMagpie
2018/10/26 全球购物
意大利中国电子产品购物网站:Geekmall.com
2019/09/30 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
学校元旦晚会开场白
2014/12/14 职场文书
感谢信范文大全
2015/01/23 职场文书
签订劳动合同通知书
2015/04/16 职场文书