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实现二分查找与bisect模块详解
Jan 13 Python
使用python和Django完成博客数据库的迁移方法
Jan 05 Python
Python 找到列表中满足某些条件的元素方法
Jun 26 Python
python创建文件备份的脚本
Sep 11 Python
Python使用gRPC传输协议教程
Oct 16 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
python图形开发GUI库wxpython使用方法详解
Feb 14 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
Django-silk性能测试工具安装及使用解析
Nov 28 Python
python中append函数用法讲解
Dec 11 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学习笔记之 函数声明(二)
2011/06/09 PHP
PHP反射使用实例和PHP反射API的中文说明
2014/07/02 PHP
smarty表格换行实例
2014/12/15 PHP
php判断表是否存在的方法
2015/06/18 PHP
PHP token验证生成原理实例分析
2019/06/05 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
2019/10/08 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
2020/02/28 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
jQuery 入门级学习笔记及源码
2010/01/22 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
使用ImageMagick进行图片缩放、合成与裁剪(js+python)
2013/09/16 Javascript
jQuery对val和atrr("value")赋值的区别介绍
2014/09/26 Javascript
jquery中filter方法用法实例分析
2015/02/06 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
2016/07/14 Javascript
Bootstrap被封装的弹层
2016/07/20 Javascript
ES6新特性之字符串的扩展实例分析
2017/04/01 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
Vue使用vux-ui自定义表单验证遇到的问题及解决方法
2018/05/10 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
Windows下安装python2和python3多版本教程
2017/03/30 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
2013/01/31 HTML / CSS
Clarks鞋美国官网:全球领军鞋履品牌
2017/05/13 全球购物
享誉全球的多元化时尚精品购物平台:Farfetch发发奇(支持中文)
2017/08/08 全球购物
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
英国豪华装饰照明品牌的在线零售商:Inspyer Lighting
2019/12/10 全球购物
社区领导班子四风问题原因分析及整改措施
2014/09/28 职场文书
2015年社区反邪教工作总结
2015/10/14 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL