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实现抓取页面上链接的简单爬虫分享
Jan 21 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
浅谈python中的占位符
Nov 09 Python
django利用request id便于定位及给日志加上request_id
Aug 26 Python
python组合无重复三位数的实例
Nov 13 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
Django import export实现数据库导入导出方式
Apr 03 Python
在pycharm中关掉ipython console/PyDev操作
Jun 09 Python
Python paramiko使用方法代码汇总
Nov 20 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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流量统计功能的实现代码
2012/09/29 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
php生成QRcode实例
2014/09/22 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
2016/06/13 PHP
laravel5使用freetds连接sql server的方法
2018/12/07 PHP
PHP的图像处理实例小结【文字水印、图片水印、压缩图像等】
2019/12/20 PHP
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
基于jquery实现的图片在各种分辨率下未知的容器内上下左右居中
2014/05/11 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
浅谈React高阶组件
2018/03/28 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
Node.js操作系统OS模块用法分析
2019/01/04 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
微信小程序wx.request拦截器使用详解
2019/07/09 Javascript
vue组件命名和props命名代码详解
2019/09/01 Javascript
JavaScript实现动态生成表格
2020/08/02 Javascript
Python微信库:itchat的用法详解
2017/08/14 Python
详解Python装饰器
2019/03/25 Python
python实现DEM数据的阴影生成的方法
2019/07/23 Python
localStorage 设置过期时间的方法实现
2018/12/21 HTML / CSS
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
学校消防安全责任书
2014/07/23 职场文书
小学二年级数学教学计划
2015/01/20 职场文书
画展邀请函
2015/01/31 职场文书
物业保安辞职信
2015/05/12 职场文书
周末问候语大全
2015/11/10 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis