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 16 Python
python去掉字符串中重复字符的方法
Feb 27 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
Python中__name__的使用实例
Apr 14 Python
简化Python的Django框架代码的一些示例
Apr 20 Python
python实现发送邮件及附件功能
Mar 02 Python
Django 前后台的数据传递的方法
Aug 08 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
python 集合 并集、交集 Series list set 转换的实例
May 29 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
CentOS7安装Python3的教程详解
Apr 10 Python
使用pytorch搭建AlexNet操作(微调预训练模型及手动搭建)
Jan 18 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
PHP 日期时间函数的高级应用技巧
2009/10/10 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
PHP rsa加密解密算法原理解析
2020/12/09 PHP
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
js键盘上下左右键怎么触发function(实例讲解)
2013/12/14 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
2018/09/04 Javascript
独立部署小程序基于nodejs的服务器过程详解
2019/06/24 NodeJs
深入浅析Python中join 和 split详解(推荐)
2016/06/30 Python
Python闭包的两个注意事项(推荐)
2017/03/20 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python 进程的几种创建方式详解
2019/08/29 Python
python实现智能语音天气预报
2019/12/02 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
Python插件机制实现详解
2020/05/04 Python
Python 如何查找特定类型文件
2020/08/17 Python
Python实现像awk一样分割字符串
2020/09/15 Python
Python join()函数原理及使用方法
2020/11/14 Python
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
劲霸男装广告词改编版
2014/03/21 职场文书
中学生操行评语大全
2014/04/24 职场文书
环境卫生倡议书
2014/08/29 职场文书
升学宴演讲稿
2014/09/01 职场文书
出国签证在职证明
2014/09/20 职场文书
2015年路政工作总结
2015/05/22 职场文书
2016年学校爱国卫生月活动总结
2016/04/06 职场文书
ORACLE数据库对long类型字段进行模糊匹配的解决思路
2021/04/07 Oracle