通过代码实例展示Python中列表生成式的用法


Posted in Python onMarch 31, 2015

1 平方列表

如果你想创建一个包含1到10的平方的列表,你可以这样做:

squares = []
for x in range(10):
 squares.append(x**2)

 

这是一个简单的例子,但是使用列表生成式可以更简洁地创建这个列表。

squares = [x**2 for x in range(10)]

这个最简单的列表生成式由方括号开始,方括号内部先是一个表达式,其后跟着一个for语句。列表生成式总是返回一个列表。

2 整除3的数字列表

通常,你可能这样写:

numbers = []
for x in range(100):
 if x % 3 == 0:
  numbers.append(x)

你可以在列表生成式里包含一个if语句,来有条件地为列表添加项。为了创建一个包含0到100间能被3整除的数字列表,可以使用列表推导式:

numbers = [x for x in range(100) if x % 3 == 0]

3 找出质数

这通常要使用好几行代码来实现。

noprimes = []
for i in range(2, 8):
 for j in range(i*2, 50, i):
  noprimes.append(j)
primes = []
for x in range(2, 50):
 if x not in noprimes:
  primes.append(x)

不过,你可以使用两个列表生成式来简化代码。

noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)]
primes = [x for x in range(2, 50) if x not in noprimes]

第一行代码在一个列表生成式里使用了多层for循环。第一个循环是外部循环,第二个循环是是内部循环。为了找到质数,我们首先找到一个非质数的列表。通过找出2-7的倍数来产生这个非质数列表。然后我们循环遍历数字并查看每个数字是否在非质数列表。

修正:正如reddit上的shoyer指出的,使用集合(set)来查找noprimes(代码里的属性参数,译者注)效率更高。由于noprimes应该只包含唯一的值,并且我们频繁地去检查一个值是否存在,所以我们应该使用集合。集合的使用语法和列表的使用语法类似,所以我们可以这样使用:

noprimes = set(j for i in range(2, 8) for j in range(i*2, 50, i))
primes = [x for x in range(2, 50) if x not in noprimes]

4 嵌套列表降维

假设你有一个列表的列表(列表里包含列表)或者一个矩阵,

matrix = [[0,1,2,3], [4,5,6,7], [8,9,10,11]]

并且你想把它降维到一个一维列表。你可以这样做:

flattened = []
for row in matrix:
 for i in row:
  flattened.append(i)

使用列表生成式:

flattened = [i for row in matrix for i in row]

这使用了两个for循环去迭代整个矩阵。外层(第一个)循环按行迭代,内部(第二个)循环对该行的每个项进行迭代。

5 模拟多个掷硬币事件

假设需要模拟多次掷硬币事件,其中0表示正面,1表示反面,你可以这样编写代码:

from random import random
results = []
for x in range(10):
 results.append(int(round(random())))

或者使用列表生成式使代码更简洁:

from random import random
results = [int(round(random())) for x in range(10)]

这里使用了range函数循环了10次。每一次我们都把random()的输出进行四舍五入。因为random()函数返回一个0到1的浮点数,所以对输出进行四舍五入就会返回0或者1。Round()函数返回一个浮点型数据,使用int()将其转为整型并添加到列表里。

6 移除句子中的元音字母

假设你有一个句子,

sentence = 'Your mother was a hamster'

并且你想移除所有的元音字母。我们可以使用几行代码轻易做到:

vowels = 'aeiou'
non_list = []
for l in sentence:
 if not l in vowels:
  non_list.append(l)
nonvowels = ''.join(non_list)

或者你可以使用列表生成式简化它:

vowels = 'aeiou'
nonvowels = ''.join([l for l in sentence if not l in vowels])

这个例子使用列表生成式创建一个字母列表,字母列表的字母来自sentence句子的非元音字母。然后我们把生成的列表传给join()函数去转换为字符串。

修正:正如reddit上的iamadogwhatisthis提出的,这个例子不需要列表生成式。使用生成器(generator)更好:

vowels = 'aeiou'
nonvowels = ''.join(l for l in sentence if not l in vowels)

注意,这里去掉了方括号。这是因为join函数接收任意可迭代的数据,包括列表或者生成器。这个没有方括号的语法使用了生成器。这产生(与列表生成式)同样的结果,相对于之前把所有条目包装成一个列表,生成器在我们遍历时才产生相应的条目。这可以使我们不必保存整个列表到内存,并且这对于处理大量数据更有效率。

 7 获取目录里的文件名列表

下面的代码将会遍历my_dir目录下的文件,并在files里追加每个以txt为后缀的文件名。

import os
files = []
for f in os.listdir('./my_dir'):
 if f.endswith('.txt'):
  files.append(f)

这同样可以使用列表生成式简化代码:

import os
files = [f for f in os.listdir('./my_dir') if f.endswith('.txt')]

或者你可以获取一个相对路径的列表:

import os
files = [os.path.join('./my_dir', f) for f in os.listdir('./my_dir') if f.endswith('.txt')]

感谢reddit上的rasbt提供。

8 将csv文件读取为字典列表

我们常常需要读取和处理csv文件的数据。处理csv数据的一个最有用的方法就是把它转换为一个字典列表。

import csv
data = []
for x in csv.DictReader(open('file.csv', 'rU')):
 data.append(x)

你可以使用列表生成式快速实现:

import csv
data = [ x for x in csv.DictReader(open('file.csv', 'rU'))]

DictReader类将会自动地使用csv文件的第一行作为字典的key属性名。DictReader类返回一个将会遍历csv文件所有行的对象。这个文件对象通过open()函数产生。我们提供了open()两个参数?第一个是csv文件名,第二个是模式。在这例子,‘rU'有两个意思。想往常一样,‘r'表示以读模式打开文件。‘U'表明我们将会接受通用换行符?‘n',‘r'和‘rn'。

感谢reddit上的blacwidonsfw提供。

Python 相关文章推荐
Python实现的几个常用排序算法实例
Jun 16 Python
python中文分词教程之前向最大正向匹配算法详解
Nov 02 Python
Random 在 Python 中的使用方法
Aug 09 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
Django+Xadmin构建项目的方法步骤
Mar 06 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
Python OpenCV调用摄像头检测人脸并截图
Aug 20 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
python super的使用方法及实例详解
Sep 25 Python
python实现时间序列自相关图(acf)、偏自相关图(pacf)教程
Jun 03 Python
使用Python实现一个简单的项目监控
Mar 31 #Python
详解Python中内置的NotImplemented类型的用法
Mar 31 #Python
python计算N天之后日期的方法
Mar 31 #Python
使用Python3中的gettext模块翻译Python源码以支持多语言
Mar 31 #Python
python根据出生日期获得年龄的方法
Mar 31 #Python
用Python进行一些简单的自然语言处理的教程
Mar 31 #Python
用Python制作在地图上模拟瘟疫扩散的Gif图
Mar 31 #Python
You might like
php学习笔记 数组的常用函数
2011/06/13 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
如何使用PHP批量去除文件UTF8 BOM信息
2013/08/05 PHP
Netbeans 8.2将支持PHP7 更精彩
2016/06/13 PHP
Zend Framework入门教程之Zend_Db数据库操作详解
2016/12/08 PHP
php实现文件管理与基础功能操作
2017/03/21 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
2013/04/11 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
使用JavaScript实现表格编辑器(实例讲解)
2017/08/02 Javascript
angular.extend方法的具体使用
2017/09/14 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
vue router 源码概览案例分析
2018/10/09 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
逐行分析鸿蒙系统的 JavaScript 框架(推荐)
2020/09/17 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python threading多线程编程实例
2014/09/18 Python
在Python的Django框架中为代码添加注释的方法
2015/07/16 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
Python虚拟环境的创建和使用详解
2020/09/07 Python
中专生职业生涯规划书范文
2014/01/10 职场文书
办公室禁烟通知
2015/04/23 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
SpringBoot2零基础到精通之异常处理与web原生组件注入
2022/03/22 Java/Android