python 中的列表解析和生成表达式


Posted in Python onMarch 10, 2011

列表解析

在需要改变列表而不是需要新建某列表时,可以使用列表解析。列表解析表达式为:

[expr for iter_var in iterable] [expr for iter_var in iterable if cond_expr]
第一种语法:首先迭代iterable里所有内容,每一次迭代,都把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。
第二种语法:加入了判断语句,只有满足条件的内容才把iterable里相应内容放到iter_var中,再在表达式中应用该iter_var的内容,最后用表达式的计算值生成一个列表。

举例如下:

>>> L= [(x+1,y+1) for x in range(3) for y in range(5)] 
>>> L 
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)] 
>>> N=[x+10 for x in range(10) if x>5] 
>>> N 
[16, 17, 18, 19]

生成器表达式

生成器表达式是在python2.4中引入的,当序列过长, 而每次只需要获取一个元素时,应当考虑使用生成器表达式而不是列表解析。生成器表达式的语法和列表解析一样,只不过生成器表达式是被()括起来的,而不是[],如下:
(expr for iter_var in iterable) 
(expr for iter_var in iterable if cond_expr)

例:
>>> L= (i + 1 for i in range(10) if i % 2) 
>>> L 
<generator object <genexpr> at 0xb749a52c> 
>>> L1=[] 
>>> for i in L: 
... L1.append(i) 
... 
>>> L1 
[2, 4, 6, 8, 10]

生成器表达式并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生”(yield)出来。 生成器表达式使用了“惰性计算”(lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用call by need的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated),所以在列表比较长的情况下使用内存上更有效。A generator object in python is something like a lazy list. The elements are only evaluated as soon as you iterate over them.

一些说明:

1. 当需要只是执行一个循环的时候尽量使用循环而不是列表解析,这样更符合python提倡的直观性。

for item in sequence: 
process(item)

2. 当有内建的操作或者类型能够以更直接的方式实现的,不要使用列表解析。

例如复制一个列表时,使用:L1=list(L)即可,不必使用:

L1=[x for x in L]

3. 如果需要对每个元素都调用并且返回结果时,应使用L1=map(f,L), 而不是 L1=[f(x) for x in L]
Python 相关文章推荐
跟老齐学Python之用while来循环
Oct 02 Python
python使用xmlrpclib模块实现对百度google的ping功能
Jun 02 Python
Python django实现简单的邮件系统发送邮件功能
Jul 14 Python
详解python中的 is 操作符
Dec 26 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
详解程序意外中断自动重启shell脚本(以Python为例)
Jul 26 Python
Django发送邮件功能实例详解
Sep 02 Python
查看jupyter notebook每个单元格运行时间实例
Apr 22 Python
为什么相对PHP黑python的更少
Jun 21 Python
学python需要去培训机构吗
Jul 01 Python
python实现ping命令小程序
Dec 28 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
Python中使用中文的方法
Feb 19 #Python
python实现的防DDoS脚本
Feb 08 #Python
Python牛刀小试密码爆破
Feb 03 #Python
初学python数组的处理代码
Jan 04 #Python
让python json encode datetime类型
Dec 28 #Python
让python的Cookie.py模块支持冒号做key的方法
Dec 28 #Python
python封装对象实现时间效果
Apr 23 #Python
You might like
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
PHP stream_context_create()函数的使用示例
2015/05/12 PHP
简单的自定义php模板引擎
2016/08/26 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
js简单判断flash是否加载完成的方法
2016/06/21 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
jquery一键控制checkbox全选、反选或全不选
2017/10/16 jQuery
vue服务端渲染缓存应用详解
2018/09/12 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
python Tkinter版学生管理系统
2019/02/20 Python
python文件写入write()的操作
2019/05/14 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
在Python IDLE 下调用anaconda中的库教程
2020/03/09 Python
python 实现两个npy档案合并
2020/07/01 Python
PyQt5的相对布局管理的实现
2020/08/07 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
澳大利亚领先的孕妇服装品牌:Mamaway
2018/08/14 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
机电专业体育教师求职信
2013/09/21 职场文书
大学生就业意向书范文
2014/04/01 职场文书
2014司机年终工作总结
2014/12/05 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL