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函数中定义参数的四种方式
Nov 30 Python
Python中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
python使用str & repr转换字符串
Oct 13 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
用Python写一个模拟qq聊天小程序的代码实例
Mar 06 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
Nov 11 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
Python docutils文档编译过程方法解析
Jun 23 Python
python 标准库原理与用法详解之os.path篇
Oct 24 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 图像处理类1
2009/06/15 PHP
php cookies中删除的一般赋值方法
2011/05/07 PHP
jQuery 源码分析笔记
2011/05/25 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
YII框架关联查询操作示例
2019/04/29 PHP
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
JavaScript极简入门教程(二):对象和函数
2014/10/25 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
JS变量及其作用域
2017/03/29 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
js 原生判断内容区域是否滚动到底部的实例代码
2017/11/15 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
基于原生js实现判断元素是否有指定class名
2020/07/11 Javascript
详解Python3.1版本带来的核心变化
2015/04/07 Python
python模块smtplib实现纯文本邮件发送功能
2018/05/22 Python
python连接mongodb集群方法详解
2020/02/13 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
在Python中字典按值排序的实现方法
2020/11/12 Python
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
荷兰和比利时时尚鞋店:Van Dalen
2018/04/23 全球购物
美国玩具公司:U.S.Toy
2018/05/19 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
护理不良事件检讨书
2014/02/06 职场文书
高中学生干部学习的自我评价
2014/02/21 职场文书
公务员保密承诺书
2014/03/27 职场文书
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电