在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 18 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
Python设计模式之中介模式简单示例
Jan 09 Python
Django如何防止定时任务并发浅析
May 14 Python
python写入文件自动换行问题的方法
Jul 05 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
python字典的遍历3种方法详解
Aug 10 Python
PyCharm 专业版安装图文教程
Feb 20 Python
Python开发企业微信机器人每天定时发消息实例
Mar 17 Python
python Django 反向访问器的外键冲突解决
May 20 Python
Pandas对每个分组应用apply函数的实现
Dec 13 Python
Python学习之异常中的finally使用详解
Mar 16 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&amp;mysql(二)
2006/10/09 PHP
动态生成gif格式的图像要注意?
2006/10/09 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
PHP实现递归的三种方法
2020/07/04 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
30分钟就入门的正则表达式基础教程
2013/02/25 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
Bootstrap~多级导航(级联导航)的实现效果【附代码】
2016/03/08 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
可用于监控 mysql Master Slave 状态的python代码
2013/02/10 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
python dataframe astype 字段类型转换方法
2018/04/11 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
详解Pycharm与anaconda安装配置指南
2020/08/25 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
幼儿园春游活动方案
2014/01/19 职场文书
高速铁道技术专业求职信
2014/08/09 职场文书
群众路线四风问题整改措施
2014/09/27 职场文书
欢迎新生标语
2014/10/06 职场文书
罗马假日观后感
2015/06/08 职场文书
毕业证明书
2015/06/19 职场文书