前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解Python列表推导式

详解Python列表推导式

作者头像
Python小屋屋主
发布于 2018-04-16 07:51:57
发布于 2018-04-16 07:51:57
1.6K0
举报
文章被收录于专栏:Python小屋Python小屋

列表推导式可以使用非常简洁的方式对列表或其他可迭代对象的元素进行遍历和过滤,快速生成满足特定需求的列表,代码具有非常强的可读性,是Python程序开发时应用最多的技术之一。Python的内部实现对列表推导式做了大量优化,可以保证很快的运行速度,也是推荐使用的一种技术。列表推导式的语法形式为:

[表达式 for 变量 in 序列或迭代对象 if 条件表达式]

列表推导式在逻辑上等价于一个循环语句,只是形式上更加简洁。例如,

>>> aList = [x*x for x in range(10)]

相当于

>>> aList = []

>>> for x in range(10):

aList.append(x*x)

大家应该知道一个故事,说是阿凡提(也有的说是阿基米德,这不是重点)与国王比赛下棋,国王说要是自己输了的话阿凡提想要什么他都可以拿得出来。阿凡提说那就要点米吧,棋盘一共64个小格子,在第一个格子里放1粒米,第二个格子里放2粒米,第三个格子里放4粒米,第四个格子里放8粒米,以此类推,后面每个格子里的米都是前一个格子里的2倍,一直把64个格子都放满。那么到底需要多少粒米呢,其实使用列表推导式再结合内置函数sum()就很容易知道答案。

>>> sum([2**i for i in range(64)])

18446744073709551615

按一斤大米约26000粒计算,为放满棋盘,需要大概350亿吨大米。结果可想而知,最后国王没有办法拿出那么多米。

接下来再通过几个示例来进一步展示列表推导式的强大功能。

(1)实现嵌套列表的平铺

>>> vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> [num for elem in vec for num in elem]

[1, 2, 3, 4, 5, 6, 7, 8, 9]

在这个列表推导式中有2个循环,其中第一个循环可以看做是外循环,执行的慢;而第二个循环可以看做是内循环,执行的快。上面代码的执行过程等价于下面的写法:

>>> vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

>>> result = []

>>> for elem in vec:

for num in elem:

result.append(num)

>>> result

[1, 2, 3, 4, 5, 6, 7, 8, 9]

当然,这里演示的只是一层嵌套列表的平铺,如果有多级嵌套或者不同子列表嵌套深度不同的话,就不能使用上面的思路了。这时,可以使用函数递归实现。

(2)过滤不符合条件的元素

在列表推导式中可以使用if子句对列表中的元素进行筛选,只在结果列表中保留符合条件的元素。例如下面的代码可以列出当前文件夹下所有Python源文件:

>>> import os

>>> [filename for filename in os.listdir('.') if filename.endswith('.py')]

下面的代码用于从列表中选择符合条件的元素组成新的列表:

>>> aList = [-1, -4, 6, 7.5, -2.3, 9, -11]

>>> [i for i in aList if i>0] #所有大于0的数字

[6, 7.5, 9]

再例如,已知有一个包含一些同学成绩的字典,现在需要计算所有成绩的最高分、最低分、平均分,并查找所有最高分同学,代码可以这样编写:

>>> scores = {"Zhang San": 45,

"Li Si": 78,

"Wang Wu": 40,

"Zhou Liu": 96,

"Zhao Qi": 65,

"Sun Ba": 90,

"Zheng Jiu": 78,

"Wu Shi": 99,

"Dong Shiyi": 60}

>>> highest = max(scores.values()) #最高分

>>> lowest = min(scores.values()) #最低分

>>> average = sum(scores.values())/len(scores) #平均分

>>> highest, lowest, average

(99, 40, 72.33333333333333)

>>> highestPerson = [name for name, score in scores.items() if score == highest]

>>> highestPerson

['Wu Shi']

(3)同时遍历多个列表或可迭代对象

>>> [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

对于包含多个循环的列表推导式,一定要清楚多个循环的执行顺序或“嵌套关系”。例如,上面的代码等价于

>>> result = []

>>> for x in [1, 2, 3]:

for y in [3, 1, 4]:

if x != y:

result.append((x,y))

>>> result

[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

(4)使用列表推导式实现矩阵转置

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

>>> [[row[i] for row in matrix] for i in range(4)]

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

对于嵌套了列表推导式的列表推导式,一定要清楚其执行顺序。例如,上面列表推导式的执行过程等价于下面的代码

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

>>> result = []

>>> for i in range(len(matrix[0])):

result.append([row[i] for row in matrix])

>>> result

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

如果把内层的列表推导式也展开的话,完整的执行过程可以通过下面的代码来模拟:

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

>>> result = []

>>> for i in range(len(matrix[0])):

temp = []

for row in matrix:

temp.append(row[i])

result.append(temp)

>>> result

[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

(5)列表推导式中可以使用函数或复杂表达式

>>> def f(v):

if v%2 == 0:

v = v**2

else:

v = v+1

return v

>>> print([f(v) for v in [2, 3, 4, -1] if v>0])

[4, 4, 16]

(6)列表推导式支持文件对象迭代

>>> with open('C:\\RHDSetup.log', 'r') as fp:

print([line for line in fp])

(7)使用列表推导式生成100以内的所有素数

>>> from math import sqrt

>>> [ p for p in range(2, 100) if 0 not in [ p% d for d in range(2, int(sqrt(p))+1)] ]

[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-10-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python小屋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解Python列表推导式
列表推导式,也叫列表解析式,英文名称为list comprehension,可以使用非常简洁的方式来快速生成满足特定需求的列表,代码具有非常强的可读性。另外,Python的内部实现对列表推导式做了大量优化,可以保证很快的运行速度。列表推导式的语法形式为: [表达式 for 变量 in 序列或迭代对象 if 条件表达式] 列表推导式在逻辑上相当于一个循环,只是形式更加简洁,例如: >>> aList = [x*x for x in range(10)] 相当于 >>> aList = [] >>> for x
Python小屋屋主
2018/04/16
1.2K0
Python列表推导式(1)_Python自学第二十三节
如果列表中很多元素首尾存在空格,可以使用列表推导式配合 strip() 方法快速去除这些空格。
张旭博客
2022/12/27
6520
Python列表推导式和嵌套的列表推导式
列表推导式提供了一个更简单的创建列表的方法。常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列。
py3study
2020/01/16
5.7K0
Python内置函数int高级用法
int()函数常用来把其他类型转换为整数,例如: >>>int(3.2) 3 >>>int(1/3) 其实,int是Python内置类型之一,之所以能够当作函数来用,是因为它提供了构造方法。另外,它还提供了第二个参数支持更多功能,例如: >>>int('1111', 8) 585 上面的问题是不是很熟悉呢?这也是我的15个读者群入群门槛问题之一,但是很多人进不来,说题不会做,不会做不要紧啊,随便在任何Python开发环境中执行一下就可以了,如果这还不会的话,你很可能是个假读者,或者还不了解Python,没入
企鹅号小编
2018/02/08
9590
巧用python“int”函数
在python中,可以利用关键词“int”实现其他数据类型强制转化为整形数据。不过需要注意,在python2中,有长整型,但是在python3中,无论数字多长,都是整形。
py3study
2020/01/19
2.9K0
python 列表推导式
代码解析: 在这个例子中,我们使用range(1, 11)生成1到10的数字序列,并通过列表推导式计算每个数字的平方,最终得到squares列表。
一键难忘
2024/03/21
3070
Python | 优雅的列表推导式
采用 for 循环,加条件判断,很轻松就可以实现。但有没有更简洁的实现方式?列表推导式(List Comprehension)。对比看看两者的效果。
PyStaData
2020/07/21
6360
Python列表推导式
输出结果:[‘奇’, ‘偶’, ‘奇’, ‘偶’, ‘奇’, ‘偶’, ‘奇’, ‘偶’, ‘奇’, ‘偶’]
北山啦
2022/11/27
4890
Python列表推导式
python文档:数据结构(列表的特性,del语句,元组,集合,循环技巧)字典,
本章节将详细介绍一些您已经了解的内容,并添加了一些新内容。 5.1. 列表的更多特性 列表数据类型还有很多的方法。这里是列表对象方法的清单:
川川菜鸟
2021/10/18
1.6K0
python数据结构
Python中列表是可变的,这是它区别于字符串和元组的最重要的特点,一句话概括即:列表可以修改,而字符串和元组不能。  以下是 Python 中列表
端碗吹水
2020/09/23
1.5K0
python列表推导式&&字典推导式
MaybeHC
2024/04/23
1110
Python(二) 序列
常用的序列结构:列表、元组、字符串、字典、range、zip、enumerate 等
赤蓝紫
2023/01/01
1.8K0
【经验分享】Python技巧之推导式
把这个式子分成三个部分:输出处理、for循环、if判断。其中if判断部分是可选的。
腾讯蓝鲸助手
2022/06/28
4213
掌握Python的列表推导式,提高代码效率
列表推导式(List Comprehension)是Python中一种简洁而强大的语法,用于在创建列表的同时对其进行转换、过滤或进行其他操作。使用列表推导式可以大大提高代码的效率和可读性。
网络技术联盟站
2023/07/13
5130
Python 炫技操作:推导式的五种写法
推导式(英文名:comprehensions),也叫解析式,是Python的一种独有特性。
Python编程与实战
2021/02/08
5600
Python语言程序设计之三--列表Li
最近在学习列表,在这里卡住了很久,主要是课后习题太多,而且难度也不小。像我看的这本《Python语言程序设计》--梁勇著,列表和多维列表两章课后习题就有93道之多。我的天!但是题目出的非常棒,许多题目都具有相似性。这倒不是说这些题目类似,而是它们都会用到某一个特定的函数,或者会用到某一个特定的算法。这里我要整理一下常见的列表操作和容易犯错的地方。
py3study
2020/01/17
1.2K0
Python列表推导式(多种样式列表推导式)
所谓推导式也就是Python中一种更有风格的Python代码的写法。什么样是有风格的呢?假如有个需求,它可能需要三行五行甚至是更多行代码完成,但是如果是同样的需求用推导式来书写的话很可能一行代码就完成了,所以推导式的作用就是化简代码用的。
python自学网
2022/05/06
6180
Python列表推导式(多种样式列表推导式)
Python-列表推导式
要生成list [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用list(range(0, 11)):
PayneWu
2020/12/18
5420
Python列表推导式
列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表.
Python碎片公众号
2021/02/26
8200
Python列表推导式
挑战30天学完Python:Day13 列表推导式和Lambda
在Python中,列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表。一种从序列创建列表的紧凑方式。列表推导式比使用 for 循环处理列表要快得多。
MegaQi
2023/10/21
3150
挑战30天学完Python:Day13 列表推导式和Lambda
相关推荐
详解Python列表推导式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档