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语言的12个基础知识点小结
Jul 10 Python
Python3.x中自定义比较函数
Apr 24 Python
Python+OpenCV人脸检测原理及示例详解
Oct 19 Python
python批量修改图片大小的方法
Jul 24 Python
tensorboard 可以显示graph,却不能显示scalar的解决方式
Feb 15 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
Feb 28 Python
python3 正则表达式基础廖雪峰
Mar 25 Python
Django admin管理工具TabularInline类用法详解
May 14 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
Django框架安装及项目创建过程解析
Sep 14 Python
python实现暗通道去雾算法的示例
Sep 27 Python
Python实现视频自动打码的示例代码
Apr 08 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服务器实现多session并发运行
2006/10/09 PHP
cmd下运行php脚本
2008/11/25 PHP
简单的PHP缓存设计实现代码
2011/09/30 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
使用jquery hover事件实现表格的隔行换色功能示例
2013/09/03 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
轻松实现js弹框显示选项
2016/09/13 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
JS实现间歇滚动的运动效果实例
2016/12/22 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
canvas实现图片根据滑块放大缩小效果
2017/02/24 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
2018/02/27 jQuery
vue基于mint-ui实现城市选择三级联动
2020/06/30 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
numpy使用技巧之数组过滤实例代码
2018/02/03 Python
python 读取txt,json和hdf5文件的实例
2018/06/05 Python
pandas 选择某几列的方法
2018/07/03 Python
python把转列表为集合的方法
2019/06/28 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
哪些是python中web开发框架
2020/06/17 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
大学毕业后的十年规划
2014/01/07 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
技术比武方案
2014/05/19 职场文书
2019大学毕业晚会主持词
2019/06/21 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
Python软件包安装的三种常见方法
2022/07/07 Python