在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 相关文章推荐
centos6.4下python3.6.1安装教程
Jul 21 Python
python用户评论标签匹配的解决方法
May 31 Python
Python数据可视化之画图
Jan 15 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
如何在Python 游戏中模拟引力
Mar 27 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
Apr 08 Python
Python3 ffmpeg视频转换工具使用方法解析
Aug 10 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
FP-growth算法发现频繁项集——构建FP树
Jun 24 Python
请求模块urllib之PYTHON爬虫的基本使用
Apr 08 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
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
php筛选不存在的图片资源
2015/04/28 PHP
js树形控件脚本代码
2008/07/24 Javascript
JQuery 入门实例1
2009/06/25 Javascript
利用腾讯的ip地址库做ip物理地址定位
2010/07/24 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
jQuery实现鼠标滑过Div层背景变颜色的方法
2015/02/17 Javascript
JavaScript实现水平进度条拖拽效果
2017/01/18 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
浅谈关于angularJs中使用$.ajax的注意点
2017/08/12 Javascript
vue实现图片加载完成前的loading组件方法
2018/02/05 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
2020/03/14 Javascript
Vue+elementUI实现多图片上传与回显功能(含回显后继续上传或删除)
2020/03/23 Javascript
js编写简易的计算器
2020/07/29 Javascript
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Python中的面向对象编程详解(上)
2015/04/13 Python
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
使用Python 统计高频字数的方法
2019/01/31 Python
Django models filter筛选条件详解
2020/03/16 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
水果连锁超市创业计划书
2014/01/24 职场文书
田径运动会通讯稿
2014/09/13 职场文书
房产授权委托书范本
2014/09/22 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
2014教师专业技术工作总结
2014/12/03 职场文书
后备干部推荐材料
2014/12/24 职场文书
2015年度保密工作总结
2015/04/24 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
员工安全责任协议书
2016/03/22 职场文书
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL