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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
Python正则捕获操作示例
Aug 19 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
pycharm中import呈现灰色原因的解决方法
Mar 04 Python
基于matplotlib中ion()和ioff()的使用详解
Jun 16 Python
Python如何在bool函数中取值
Sep 21 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
Python之matplotlib绘制折线图
Apr 13 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
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
PHP中mb_convert_encoding与iconv函数的深入解析
2013/06/21 PHP
CI框架文件上传类及图像处理类用法分析
2016/05/18 PHP
php基于PDO实现功能强大的MYSQL封装类实例
2017/02/27 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
js完美的div拖拽实例代码
2014/01/22 Javascript
js调用打印机打印网页字体总是缩小一号的解决方法
2014/01/24 Javascript
js实现文本框中焦点在最后位置
2014/03/04 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
js实现绿白相间竖向网页百叶窗动画切换效果
2015/03/02 Javascript
jQuery拖拽插件gridster使用指南
2015/04/21 Javascript
JS中多步骤多分步的StepJump组件实例详解
2016/04/01 Javascript
Vue.js划分组件的方法
2017/10/29 Javascript
javascript标准库(js的标准内置对象)总结
2018/05/26 Javascript
微信小程序js文件改变参数并在视图上及时更新【推荐】
2018/06/11 Javascript
JS实现面向对象继承的5种方式分析
2018/07/21 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
[02:34]DOTA2亚洲邀请赛 BG战队出场宣传片
2015/03/09 DOTA
Python使用minidom读写xml的方法
2015/06/03 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
乌克兰电子和家用电器商店:Foxtrot
2019/07/23 全球购物
巴西24小时在线药房:Drogasil
2020/06/20 全球购物
Java面试笔试题大全
2016/11/23 面试题
预备党员党校学习自我评价分享
2013/11/12 职场文书
寒假实习自荐信
2014/01/26 职场文书
ktv周年庆活动方案
2014/08/18 职场文书
社区党务工作总结2015
2015/05/19 职场文书
2016年9月份红领巾广播稿
2015/12/21 职场文书
详解CocosCreator项目结构机制
2021/04/14 Javascript
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server
Python 阶乘详解
2021/10/05 Python