在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的chardet库获得文件编码并修改编码
Jan 22 Python
Python的时间模块datetime详解
Apr 17 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
Oct 17 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
解决PyCharm控制台输出乱码的问题
Jan 16 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
Jun 21 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
python里glob模块知识点总结
Jan 05 Python
anaconda python3.8安装后降级
Jun 11 Python
Pillow图像处理库安装及使用
Apr 12 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
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
ZF等常用php框架中存在的问题
2008/01/10 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
修改php.ini以达到屏蔽错误信息并记录日志
2013/06/16 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
php源码分析之DZX1.5字符串截断函数cutstr用法
2015/06/17 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
thinkPHP5框架自定义验证器实现方法分析
2018/06/11 PHP
PHP中quotemeta()函数的用法讲解
2019/04/04 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
JavaScript 组件之旅(一)分析和设计
2009/10/28 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
2010/03/05 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
基于Vue实现拖拽功能
2020/07/29 Javascript
使用element-ui的el-menu导航选中后刷新页面保持当前选中状态
2019/07/19 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
uni-app 组件里面获取元素宽高的实现
2019/12/27 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
在Python中进行自动化单元测试的教程
2015/04/15 Python
CentOS 6.5下安装Python 3.5.2(与Python2并存)
2017/06/05 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
简单了解Python读取大文件代码实例
2019/12/18 Python
python中Django文件上传方法详解
2020/08/05 Python
NET程序员上机面试题
2015/05/23 面试题
新闻学专业个人求职信写作
2014/02/04 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
安全承诺书
2015/01/19 职场文书
消防演习通知
2015/04/25 职场文书
蔬果开业典礼发言稿应该怎么写?
2019/09/03 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS