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基于动态规划算法计算单词距离
Jul 25 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
基于python进行桶排序与基数排序的总结
May 29 Python
python使用turtle绘制分形树
Jun 22 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
Python数据类型之Number数字操作实例详解
May 08 Python
python3 深浅copy对比详解
Aug 12 Python
python文字转语音实现过程解析
Nov 12 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
python 使用csv模块读写csv格式文件的示例
Dec 02 Python
python实现定时发送邮件到指定邮箱
Dec 23 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
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
PHP isset()及empty()用法区别详解
2020/08/29 PHP
js 深拷贝函数
2008/12/04 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
JavaScript数组常用操作技巧汇总
2014/11/17 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
20分钟打造属于你的Bootstrap站点
2016/07/27 Javascript
浅析vue component 组件使用
2017/03/06 Javascript
angular2+node.js express打包部署的实战
2017/07/27 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
详细讲解如何创建, 发布自己的 Vue UI 组件库
2019/05/29 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
15分钟上手vue3.0(小结)
2020/05/20 Javascript
浅谈Vue 自动化部署打包上线
2020/06/14 Javascript
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
利用django+wechat-python-sdk 创建微信服务器接入的方法
2019/02/20 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
2020/03/30 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
Python用requests库爬取返回为空的解决办法
2021/02/21 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
英国50岁以上人群的交友网站:Ourtime
2018/03/28 全球购物
25道Java面试题集合
2013/05/21 面试题
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
Python实现机器学习算法的分类
2021/06/03 Python
Python Django项目和应用的创建详解
2021/11/27 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL