在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中函数的参数
Apr 27 Python
Python字符串逐字符或逐词反转方法
May 21 Python
编写Python脚本抓取网络小说来制作自己的阅读器
Aug 20 Python
python实现将内容分行输出
Nov 05 Python
Python彩色化Linux的命令行终端界面的代码实例分享
Jul 02 Python
Python3.6简单反射操作示例
Jun 14 Python
深入了解Python枚举类型的相关知识
Jul 09 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
Sep 23 Python
python 两个数据库postgresql对比
Oct 21 Python
python函数局部变量、全局变量、递归知识点总结
Nov 15 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
Django-simple-captcha验证码包使用方法详解
Nov 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 魔术方法详解
2014/11/11 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
php实现无限级分类(递归方法)
2015/08/06 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
php模式设计之观察者模式应用实例分析
2019/09/25 PHP
javascript 复杂的嵌套环境中输出单引号和双引号
2009/05/26 Javascript
javascript权威指南 学习笔记之变量作用域分享
2011/09/28 Javascript
jquery实现键盘左右翻页特效
2015/04/30 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
JS实现灵巧的下拉导航效果代码
2015/08/25 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
React Hooks的深入理解与使用
2018/11/12 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
js实现div色块拖动录制
2020/01/16 Javascript
vue-cli3 取消eslint校验代码的解决办法
2020/01/16 Javascript
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
2018/10/14 Python
Python装饰器语法糖
2019/01/02 Python
python3+django2开发一个简单的人员管理系统过程详解
2019/07/23 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
python Scrapy框架原理解析
2021/01/04 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
水上运动奥特莱斯:Wasterports Outlet
2018/08/08 全球购物
档案接收函范文
2014/01/10 职场文书
初中政治教学反思
2014/01/17 职场文书
自我鉴定 电子商务专业
2014/01/30 职场文书
给校长的建议书100字
2014/05/16 职场文书
优秀班组长事迹
2014/05/31 职场文书
离婚协议书怎么写
2014/09/12 职场文书
处罚决定书范文
2015/06/24 职场文书
2016年小学生寒假总结
2015/10/10 职场文书