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基础教程之Hello World!
Aug 29 Python
python文件写入实例分析
Apr 08 Python
python实现中文输出的两种方法
May 09 Python
Python3导入自定义模块的三种方法详解
Apr 13 Python
python使用Qt界面以及逻辑实现方法
Jul 10 Python
如何利用python给图片添加半透明水印
Sep 06 Python
Python 脚本拉取 Docker 镜像问题
Nov 10 Python
python tornado使用流生成图片的例子
Nov 18 Python
Python2和Python3中@abstractmethod使用方法
Feb 04 Python
Django怎么在admin后台注册数据库表
Nov 14 Python
详解Python遍历列表时删除元素的正确做法
Jan 07 Python
PyTorch 如何自动计算梯度
May 23 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中神奇的fastcgi_finish_request
2011/05/02 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
php中的静态变量的基本用法
2014/03/20 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
PHP pear安装配置教程
2016/05/14 PHP
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
原生javascript实现图片轮播效果代码
2010/09/03 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
javascript正则表达式模糊匹配IP地址功能示例
2017/01/06 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
vue+element加入签名效果(移动端可用)
2019/06/17 Javascript
在vue+element ui框架里实现lodash的debounce防抖
2019/11/13 Javascript
微信小程序实现音乐播放器
2019/11/20 Javascript
解决Nuxt使用axios跨域问题
2020/07/06 Javascript
JavaScript通如何过RGraph实现动态仪表盘
2020/10/15 Javascript
JS+CSS实现过渡特效
2021/01/02 Javascript
[51:27]LGD vs Liquid 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python操作Sql Server 2008数据库的方法详解
2018/05/17 Python
Python3数字求和的实例
2019/02/19 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
亚洲最大旅游体验平台:KKday
2017/10/21 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
管理专员自荐信
2014/01/26 职场文书
小学数学教学经验交流材料
2014/05/22 职场文书
应届生求职信范文
2014/06/30 职场文书
违纪学生保证书
2015/02/27 职场文书
2015年社区综治宣传月活动总结
2015/03/25 职场文书
公司搬迁通知
2015/04/20 职场文书
投标售后服务承诺书
2015/04/29 职场文书
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android