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 相关文章推荐
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
使用Python内置的模块与函数进行不同进制的数的转换
Mar 12 Python
python之Character string(实例讲解)
Sep 25 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Django框架组成结构、基本概念与文件功能分析
Jul 30 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
调整Jupyter notebook的启动目录操作
Apr 10 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 Python
15个Pythonic的代码示例(值得收藏)
Oct 29 Python
python利用xpath爬取网上数据并存储到django模型中
Feb 26 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创建者模式
2014/11/25 PHP
php简单分页类实现方法
2015/02/26 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
类似CSDN图片切换效果脚本
2009/09/17 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
JS对象与json字符串格式转换实例
2014/10/28 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
js实现随机点名小功能
2017/08/17 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
Vue SSR 组件加载问题
2018/05/02 Javascript
Vue.js 实现数据展示全部和收起功能
2018/09/05 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
Vue 实现从小到大的横向滑动效果详解
2019/10/16 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Linux下为不同版本python安装第三方库
2016/08/31 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
python机器学习之神经网络(二)
2017/12/20 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
应用OpenCV和Python进行SIFT算法的实现详解
2019/08/21 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
python 密码学示例——凯撒密码的实现
2020/09/21 Python
解决python3输入的坑——input()
2020/12/05 Python
印尼在线购买隐形眼镜网站:Lensza.co.id
2019/04/27 全球购物
个人找工作的自我评价
2013/10/17 职场文书
出国英文推荐信
2014/05/10 职场文书
六一儿童节开幕词
2015/01/29 职场文书
酒店开业主持词
2015/07/02 职场文书
新闻通讯稿范文
2015/07/22 职场文书
关于车尾的标语大全
2015/08/11 职场文书
《世界多美呀》教学反思
2016/02/22 职场文书