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里隐藏的“禅”
Jun 16 Python
python多线程threading.Lock锁用法实例
Nov 01 Python
Python实现复杂对象转JSON的方法示例
Jun 22 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
python调用tcpdump抓包过滤的方法
Jul 18 Python
Django组件之cookie与session的使用方法
Jan 10 Python
利用anaconda保证64位和32位的python共存
Mar 09 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
学习Python列表的基础知识汇总
Mar 10 Python
Python 字典中的所有方法及用法
Jun 10 Python
如何利用python生成MD5并去重
Dec 07 Python
Matlab如何实现矩阵复制扩充
Jun 02 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的网址
2006/11/25 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
浅谈PHP中的
2016/04/23 PHP
PHP常用函数之base64图片上传功能详解
2019/10/21 PHP
js写的方法实现上传图片之后查看大图
2014/03/05 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
js实现时间轴自动排列效果
2017/03/09 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
Vue动态组件与异步组件实例详解
2019/02/23 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
使用Python内置的模块与函数进行不同进制的数的转换
2016/03/12 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
python文件转为exe文件的方法及用法详解
2019/07/08 Python
python导包的几种方法(自定义包的生成以及导入详解)
2019/07/15 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
法拉利英国精品店:Ferraris Boutique UK
2019/07/20 全球购物
毕业生自我推荐
2013/11/04 职场文书
行政文员岗位职责
2013/11/08 职场文书
缓刑人员的思想汇报
2014/01/11 职场文书
大学生社会实践评语
2014/04/25 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
弘扬焦裕禄精神走群众路线思想汇报
2014/09/12 职场文书
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
质量主管工作职责
2014/09/26 职场文书
欢迎新生标语
2014/10/06 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
土建技术员岗位职责
2015/04/11 职场文书
2019事业单位个人工作总结范文
2019/08/26 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang
python数字类型和占位符详情
2022/03/13 Python
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers