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重新引入被覆盖的自带function
Jul 16 Python
linux 下实现python多版本安装实践
Nov 18 Python
python随机生成指定长度密码的方法
Apr 04 Python
在Linux下调试Python代码的各种方法
Apr 17 Python
Python编程之event对象的用法实例分析
Mar 23 Python
python使用mysql数据库示例代码
May 21 Python
Python格式化输出%s和%d
May 07 Python
pandas的qcut()方法详解
Jul 06 Python
Python input函数使用实例解析
Nov 22 Python
浅谈python之自动化运维(Paramiko)
Jan 31 Python
python上传时包含boundary时的解决方法
Apr 08 Python
Python 保存加载mat格式文件的示例代码
Aug 04 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
PHP的可变变量名的使用方法分享
2012/02/05 PHP
PHP时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
thinkPHP5.0框架应用请求生命周期分析
2017/03/25 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
js/jquery判断浏览器的方法小结
2014/09/02 Javascript
jquery获取节点名称
2015/04/26 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
2016/05/05 Javascript
JS中对象与字符串的互相转换详解
2016/05/20 Javascript
输入法的回车与消息发送快捷键回车的冲突解决方法
2016/08/09 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
使用vue的v-for生成table并给table加上序号的实例代码
2017/10/27 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
记录Django开发心得
2014/07/16 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
2016/06/29 Python
python中import与from方法总结(推荐)
2019/03/21 Python
详解Python:面向对象编程
2019/04/10 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
python实现身份证实名认证的方法实例
2019/11/08 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
Tech21美国/加拿大:英国NO.1防摔保护壳品牌
2018/01/20 全球购物
英国领先的野生鸟类食品供应商:GardenBird
2018/08/09 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
服装设计行业个人的自我评价
2013/12/20 职场文书
培训自我鉴定
2014/01/31 职场文书
草船借箭教学反思
2014/02/03 职场文书
2014年信用社工作总结
2014/11/25 职场文书
2015年母亲节活动总结
2015/02/10 职场文书
困难补助申请报告
2015/05/19 职场文书
小学运动会入场词
2015/07/18 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python