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使用xmlrpc实例讲解
Dec 17 Python
使用python解析xml成对应的html示例分享
Apr 02 Python
详解Python中expandtabs()方法的使用
May 18 Python
Python 序列的方法总结
Oct 18 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python读出当前时间精度到秒的代码
Jul 05 Python
Python代码生成视频的缩略图的实例讲解
Dec 22 Python
python实现逢七拍腿小游戏的思路详解
May 26 Python
Python如何使用input函数获取输入
Aug 06 Python
Python 在 VSCode 中使用 IPython Kernel 的方法详解
Sep 05 Python
python实现经纬度采样的示例代码
Dec 10 Python
Python函数式编程中itertools模块详解
Sep 15 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
?生?D片??C字串
2006/12/06 PHP
实用函数10
2007/11/08 PHP
php删除数组元素示例分享
2014/02/17 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
20个非常棒的 jQuery 幻灯片插件和教程分享
2011/08/23 Javascript
Jquery 的扩展方法总结
2011/10/01 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JS网页在线获取鼠标坐标值的方法
2015/02/28 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
JQuery.Ajax()的data参数类型实例详解
2015/11/20 Javascript
JavaScript数据操作_浅谈原始值和引用值的操作本质
2016/08/23 Javascript
js表单登陆验证示例
2016/10/19 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
JS对象深度克隆实例分析
2017/03/16 Javascript
微信小程序 跳转传递数据的实例
2017/07/06 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
axios中cookie跨域及相关配置示例详解
2017/12/20 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
django如何实现视图重定向
2019/07/24 Python
用Python批量把文件复制到另一个文件夹的实现方法
2019/08/16 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
英国的领先快速时尚零售商:In The Style
2019/03/25 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
省级青年文明号申报材料
2014/05/23 职场文书
意向协议书
2015/01/27 职场文书
公司保洁员管理制度
2015/08/04 职场文书
公司借款担保书
2015/09/22 职场文书
《中华上下五千年》读后感3篇
2019/11/29 职场文书
MySQL连接控制插件介绍
2021/09/25 MySQL