在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 相关文章推荐
python3.5使用tkinter制作记事本
Jun 20 Python
python框架django基础指南
Sep 08 Python
Python中__init__.py文件的作用详解
Sep 18 Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 Python
对python程序内存泄漏调试的记录
Jun 11 Python
python得到单词模式的示例
Oct 15 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
使用python制作一个为hex文件增加版本号的脚本实例
Jun 12 Python
Pycharm 2020最新永久激活码(附最新激活码和插件)
Sep 17 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
Feb 03 Python
解决flask接口返回的内容中文乱码的问题
Apr 03 Python
Python基础详解之描述符
Apr 28 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/10/09 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
关于JS字符串函数String.replace()
2013/04/07 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
完美实现八种js焦点轮播图(下篇)
2020/04/20 Javascript
JavaScript比较当前时间是否在指定时间段内的方法
2016/08/02 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
学习vue.js计算属性
2016/12/03 Javascript
详解Angualr 组件间通信
2017/01/21 Javascript
Bootstrap模态框插件使用详解
2017/05/11 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
layer实现关闭弹出层刷新父界面功能详解
2017/11/15 Javascript
关于Mac下安装nodejs、npm和cnpm的教程
2018/04/11 NodeJs
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
Python中is与==判断的区别
2017/03/28 Python
python 通过字符串调用对象属性或方法的实例讲解
2018/04/21 Python
Python读取mat文件,并保存为pickle格式的方法
2018/10/23 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
工程招投标邀请书
2014/01/26 职场文书
迎新晚会邀请函
2014/02/01 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
调解协议书
2014/04/16 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
四风对照检查材料思想汇报
2014/09/20 职场文书
综合实践活动报告
2015/02/05 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
小学生读书笔记
2015/07/01 职场文书
Python基于Opencv识别两张相似图片
2021/04/25 Python
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸