在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之折腾一下目录
Oct 24 Python
Python读写ini文件的方法
May 28 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
Python爬虫的两套解析方法和四种爬虫实现过程
Jul 20 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
使用Django简单编写一个XSS平台的方法步骤
Mar 25 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python实现搜索算法的实例代码
Jan 02 Python
OpenCV Python实现拼图小游戏
Mar 23 Python
在jupyter notebook 添加 conda 环境的操作详解
Apr 10 Python
keras 多任务多loss实例
Jun 22 Python
TensorFlow Autodiff自动微分详解
Jul 06 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
mac下使用brew配置环境的步骤分享
2011/05/23 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
2014/03/28 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
如何通过View::first使用Laravel Blade的动态模板详解
2017/09/21 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
javascript返回顶部效果(自写代码)
2013/01/06 Javascript
JQuery中form验证出错信息的查看方法
2013/10/08 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
JavaScrpt判断一个数是否是质数的实例代码
2017/06/11 Javascript
js点击时关闭该范围下拉菜单之外的菜单方法
2018/01/11 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
从0到1学习JavaScript编写贪吃蛇游戏
2020/07/28 Javascript
Vue Object.defineProperty及ProxyVue实现双向数据绑定
2020/09/02 Javascript
javascript贪吃蛇游戏设计与实现
2020/09/17 Javascript
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
Python 利用scrapy爬虫通过短短50行代码下载整站短视频
2018/10/29 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
检察官就职演讲稿
2014/01/13 职场文书
大学生职业生涯规划书模板
2014/01/18 职场文书
气象学专业个人求职信
2014/04/22 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
县政府领导班子四风问题对照检查材料思想汇报
2014/09/26 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
2015年公司新年寄语
2014/12/08 职场文书
骨干教师个人总结
2015/02/11 职场文书
工作调动申请报告
2015/05/18 职场文书
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技