在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判断字符串与大小写转换
Jun 08 Python
Python中将字典转换为XML以及相关的命名空间解析
Oct 15 Python
python 网络编程常用代码段
Aug 28 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
Apr 15 Python
python实现比较文件内容异同
Jun 22 Python
python中的常量和变量代码详解
Jul 25 Python
python ChainMap的使用和说明详解
Jun 11 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
基于python实现对文件进行切分行
Apr 26 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
详解python with 上下文管理器
Sep 02 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
PHP4 与 MySQL 数据库操作函数详解
2006/10/09 PHP
以文本方式上传二进制文件的PHP程序
2006/10/09 PHP
mysql中存储过程、函数的一些问题
2007/02/14 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
PHP安全防范技巧分享
2011/11/03 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
JavaScript中也使用$美元符号来代替document.getElementById
2010/06/19 Javascript
Web开发之JavaScript
2012/03/29 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
解决bootstrap中modal遇到Esc键无法关闭页面
2015/03/09 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
JS与Ajax Get和Post在使用上的区别实例详解
2016/06/08 Javascript
jQuery 中ajax异步调用的四种方式
2016/06/28 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
详解mpvue scroll-view自动回弹bug解决方案
2018/10/01 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
微信小程序缓存支持二次开发封装实现解析
2019/12/16 Javascript
vue将data恢复到初始状态 &amp;&amp; 重新渲染组件实例
2020/09/04 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python的面向对象思想分析
2015/01/14 Python
python对html代码进行escape编码的方法
2015/05/04 Python
Python中内建函数的简单用法说明
2016/05/05 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
在Python中执行系统命令的方法示例详解
2017/09/14 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
django 读取图片到页面实例
2020/03/27 Python
应届生求职自荐信范文
2014/04/07 职场文书
卫生厅领导班子党的群众路线教育实践活动整改措施
2014/09/20 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android
Java Redisson多策略注解限流
2022/09/23 Java/Android