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多线程(python多线程简明教程)
Jun 09 Python
Python中的列表知识点汇总
Apr 14 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
运用Python的webbrowser实现定时打开特定网页
Feb 21 Python
Django 多环境配置详解
May 14 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
Python Pandas 箱线图的实现
Jul 23 Python
python Django编写接口并用Jmeter测试的方法
Jul 31 Python
Python使用enumerate获取迭代元素下标
Feb 03 Python
PyQT5 实现快捷键复制表格数据的方法示例
Jun 19 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 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
全国FM电台频率大全 - 22 重庆市
2020/03/11 无线电
收集的PHP中与数组相关的函数
2007/03/22 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
那些年一起学习的PHP(三)
2012/03/22 PHP
php curl模拟post提交数据示例
2013/12/31 PHP
php中simplexml_load_string使用实例分享
2014/02/13 PHP
浅谈ThinkPHP5.0版本和ThinkPHP3.2版本的区别
2017/06/17 PHP
JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
2008/11/03 Javascript
通过url查找a元素应用案例
2014/04/29 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
JS中的phototype详解
2017/02/04 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
webpack将js打包后的map文件详解
2018/02/22 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
Vue实现简单计算器
2021/01/20 Vue.js
python绘图库Matplotlib的安装
2014/07/03 Python
Python中的Classes和Metaclasses详解
2015/04/02 Python
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
python+numpy实现的基本矩阵操作示例
2019/07/19 Python
Python的pygame安装教程详解
2020/02/10 Python
python爬虫看看虎牙女主播中谁最“顶”步骤详解
2020/12/01 Python
软件工程专业推荐信
2013/10/28 职场文书
电子商务专业毕业生工作推荐信
2013/11/17 职场文书
合作协议书
2014/04/23 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
MySQL系列之十一 日志记录
2021/07/02 MySQL