Python 列表推导式,列表推导式python菜鸟教程
导数公式可以以非常简洁的方式遍历和过滤列表或其他迭代对象的元素,快速生成满足特定需求的列表。代码可读性很强,是Python程序开发中使用最广泛的技术之一。Python的内部实现在列表派生上做了很多优化,可以保证很快的运行速度,也是一个值得推荐的技术。推导的语法形式是:
[序列或迭代对象中变量的表达式,如果是条件表达式]
推导在逻辑上等同于循环语句,但在形式上更简洁。举个例子,
List=[x*x for x in range(10)]
胜任
List=[]
对于范围(10)中的x:
List.append(x*x)
大家应该都知道一个故事,说的是后向信封(别人说阿基米德,这不是重点)和国王下棋,国王说如果输了,后向信封要什么就可以拿出来。背面的信封上说你应该订购一些米饭。棋盘上有64个小方格。第一个方块放一粒米,第二个方块放两粒米,第三个方块放四粒米,第四个方块放八粒米,依此类推。每一个后方格的米都是前一个方格的两倍,64个方格一直都是满的。那么你需要多少粒米呢?其实利用列表求导和内置函数sum()就很容易知道答案了。
sum([2**i for i in range(64)])
18446744073709551615
按照每斤大米约26000粒计算,大约需要350亿吨大米才能填满棋盘。结果可想而知,最后国王也拿不出那么多米。
接下来举几个例子进一步说明列表推演的强大功能。
(1)实现嵌套列表的平铺
vec=[[1,2,3],[4,5,6],[7,8,9]]
vec中elem的数量,elem中的数量]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
这个列表推导有两个循环,其中第一个循环可以看作是外循环,执行起来比较慢;第二个循环可以看作是一个内循环,执行得很快。上述代码的执行过程相当于以下写法:
vec=[[1,2,3],[4,5,6],[7,8,9]]
结果=[]
对于vec中的elem:
对于elem中的num:
结果.追加(数量)
结果
[1, 2, 3, 4, 5, 6, 7, 8, 9]
当然,这里演示的只是嵌套列表的平铺。如果有多级嵌套或者不同的子列表有不同的嵌套深度,上述思路就不能用了。这时候可以用函数递归。
(2)过滤不符合条件的元素
在列表推导中,可以使用if子句过滤列表中的元素,结果列表中只保留符合条件的元素。例如,以下代码可以列出当前文件夹中的所有Python源文件:
导入操作系统
os.listdir( . 中文件名的文件名)if filename.endswith(。py)]
以下代码用于从列表中选择符合条件的元素,以形成新的列表:
List=[-1,-4,6,7.5,-2.3,9,-11]
[I for I in list if i0]#所有大于0的数字
[6, 7.5, 9]
再比如,已知有一本词典收录了一些学生的成绩。现在需要计算所有年级的最高分、最低分、平均分,找出所有最高分的学生。代码可以这样写:
scores={ 张三:45,
李四:78,
王五:40,
刘洲:96年,
赵琪:65岁,
孙霸:90,
郑九:78,
武师:99,
董世义:60}
最高=max(scores.values()) #最高分
最低=min(scores.values()) #最低分
average=sum(scores . values())/len(scores)#平均分数
最高、最低、平均
(99, 40, 72.33333333333333)
highestPerson=[name for name,scores.items中的分数()if score==highest]
最高的人
[吾师]
(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)]
对于具有多个循环的列表派生,了解多个循环的执行顺序或“嵌套关系”很重要。例如,上面的代码相当于
结果=[]
对于[1,2,3]中的x:
对于[3,1,4]中的y:
如果x!=y:
result.append((x,y))
结果
[(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]]
结果=[]
对于范围内的I(len(matrix[0]):
结果。追加([矩阵中行的第[我]行])
结果
[[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]]
结果=[]
对于范围内的I(len(matrix[0]):
temp=[]
对于矩阵中的行:
临时追加(第[我]行)
结果。追加(临时)
结果
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
(5)列表推导式中可以使用函数或复杂表达式
定义女(五):
如果v%2==0:
v=v**2
否则:
v=v 1
返回v
print([f(v) for v in [2,3,4,-1] if v0])
[4, 4, 16]
(6)列表推导式支持文件对象迭代
用打开( C:\\RHDSetup.log , r )作为fp:
打印([FP中的逐行])
(7)使用列表推导式生成100以内的所有素数
从数学导入平方根计算
[ 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]
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。