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 相关文章推荐
详解JavaScript编程中的window与window.screen对象
Oct 26 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
Python 操作文件的基本方法总结
Aug 10 Python
对Python3中的print函数以及与python2的对比分析
May 02 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
Jul 13 Python
使用Python开发SQLite代理服务器的方法
Dec 07 Python
python Plotly绘图工具的简单使用
Mar 03 Python
python中查看.db文件中表格的名字及表格中的字段操作
Jul 07 Python
python如何快速生成时间戳
Jul 21 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
如何用python写个模板引擎
Jan 14 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 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
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
9个比较实用的php代码片段
2016/03/15 PHP
Yii2处理密码加密及验证的方法
2019/05/12 PHP
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
Javascript字符串常用方法详解
2016/07/21 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
元素全屏的设置与监听实例
2017/11/28 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
Vue使用NProgress进度条的方法
2019/09/21 Javascript
对python中return和print的一些理解
2017/08/18 Python
[原创]python爬虫(入门教程、视频教程)
2018/01/08 Python
pyqt5自定义信号实例解析
2018/01/31 Python
python 不以科学计数法输出的方法
2018/07/16 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Python+Pyqt实现简单GUI电子时钟
2021/02/22 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
苏宁红孩子母婴商城:redbaby
2017/02/12 全球购物
希尔顿酒店中国网站:Hilton中国
2017/03/11 全球购物
Tessabit日本:集世界奢侈品和设计师品牌的意大利精品买手店
2020/01/07 全球购物
运动会获奖感言
2014/02/11 职场文书
小区消防演习方案
2014/02/21 职场文书
党性心得体会
2014/09/03 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
《确定位置》教学反思
2016/02/18 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python