在Python中使用列表生成式的教程


Posted in Python onApril 27, 2015

列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。

举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):

>>> range(1, 11)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:

>>> L = []
>>> for x in range(1, 11):
...  L.append(x * x)
...
>>> L
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

>>> [x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

还可以使用两层循环,可以生成全排列:

>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

三层和三层以上的循环就很少用到了。

运用列表生成式,可以写出非常简洁的代码。例如,列出当前目录下的所有文件和目录名,可以通过一行代码实现:

>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录
['.emacs.d', '.ssh', '.Trash', 'Adlm', 'Applications', 'Desktop', 'Documents', 'Downloads', 'Library', 'Movies', 'Music', 'Pictures', 'Public', 'VirtualBox VMs', 'Workspace', 'XCode']

for循环其实可以同时使用两个甚至多个变量,比如dict的iteritems()可以同时迭代key和value:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> for k, v in d.iteritems():
...   print k, '=', v
... 
y = B
x = A
z = C

因此,列表生成式也可以使用两个变量来生成list:

>>> d = {'x': 'A', 'y': 'B', 'z': 'C' }
>>> [k + '=' + v for k, v in d.iteritems()]
['y=B', 'x=A', 'z=C']

最后把一个list中所有的字符串变成小写:

>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]
['hello', 'world', 'ibm', 'apple']

小结

运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。

思考:如果list中既包含字符串,又包含整数,由于非字符串类型没有lower()方法,所以列表生成式会报错:

>>> L = ['Hello', 'World', 18, 'Apple', None]
>>> [s.lower() for s in L]
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute 'lower'

使用内建的isinstance函数可以判断一个变量是不是字符串:

>>> x = 'abc'
>>> y = 123
>>> isinstance(x, str)
True
>>> isinstance(y, str)
False

请修改列表生成式,通过添加if语句保证列表生成式能正确地执行。

Python 相关文章推荐
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python时间序列按频率生成日期的方法
May 14 Python
python装饰器常见使用方法分析
Jun 26 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
wxPython电子表格功能wx.grid实例教程
Nov 19 Python
python迭代器常见用法实例分析
Nov 22 Python
Python urllib2运行过程原理解析
Jun 04 Python
python使用多线程查询数据库的实现示例
Aug 17 Python
Python rabbitMQ如何实现生产消费者模式
Aug 24 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 Python
Python装饰器详细介绍
Mar 25 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 Python
讲解Python中的递归函数
Apr 27 #Python
理解Python中函数的参数
Apr 27 #Python
Python中自定义函数的教程
Apr 27 #Python
在Python中使用dict和set方法的教程
Apr 27 #Python
在Python中使用判断语句和循环的教程
Apr 25 #Python
详解Python中列表和元祖的使用方法
Apr 25 #Python
详解Python当中的字符串和编码
Apr 25 #Python
You might like
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
JS 网站性能优化笔记
2011/05/24 PHP
PHP 设计模式之观察者模式介绍
2012/02/22 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
ubuntu下安装nodejs以及升级的办法
2015/05/08 NodeJs
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
DOM事件探秘篇
2017/02/15 Javascript
Angular 2 利用Router事件和Title实现动态页面标题的方法
2017/08/23 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python批量转换文件编码格式
2015/05/17 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
python代码实现逻辑回归logistic原理
2019/08/07 Python
python双端队列原理、实现与使用方法分析
2019/11/27 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
拉斯维加斯酒店、演出、旅游、俱乐部及更多:Vegas.com
2019/02/28 全球购物
如何利用cmp命令比较文件
2016/04/11 面试题
大学生新闻专业个人自我评价
2013/11/12 职场文书
标准自荐信范文
2014/01/29 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
2014财产信托协议书范本
2014/11/18 职场文书
商标侵权律师函
2015/05/27 职场文书
教师学习心得体会范文
2016/01/21 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
css中z-index: 0和z-index: auto的区别
2021/08/23 HTML / CSS
Spring Bean是如何初始化的详解
2022/03/22 Java/Android