在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 相关文章推荐
Flask框架的学习指南之用户登录管理
Nov 20 Python
Python MD5加密实例详解
Aug 02 Python
Request的中断和ErrorHandler实例解析
Feb 12 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
Feb 21 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
详解python while 函数及while和for的区别
Sep 07 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
python绘图模块matplotlib示例详解
Jul 26 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
Python文字截图识别OCR工具实例解析
Mar 05 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
Python字符串查找基本操作代码案例
Oct 27 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
PHP生成静态页面详解
2006/12/05 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
jquery 弹出层实现代码
2009/10/30 Javascript
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
AJAX和jQuery动态加载数据的实现方法
2016/12/05 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
vue项目如何刷新当前页面的方法
2018/05/18 Javascript
深入理解Vue父子组件生命周期执行顺序及钩子函数
2018/08/12 Javascript
React项目动态设置title标题的方法示例
2018/09/26 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
浅谈Python单向链表的实现
2015/12/24 Python
Python实现一个转存纯真IP数据库的脚本分享
2017/05/21 Python
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
2018/12/20 Python
实例讲解Python脚本成为Windows中运行的exe文件
2019/01/24 Python
PyTorch搭建一维线性回归模型(二)
2019/05/22 Python
python使用Thread的setDaemon启动后台线程教程
2020/04/25 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
农行实习自我鉴定
2013/09/22 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
自荐信范文
2013/12/10 职场文书
学生自我评价范文
2014/02/02 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
2016年领导干部正风肃纪心得体会
2015/10/09 职场文书
java设计模式--建造者模式详解
2021/07/21 Java/Android
一篇文章带你学习Mybatis-Plus(新手入门)
2021/08/02 Java/Android
Nginx跨域问题解析与解决
2022/08/05 Servers