假期第(10)天

列表与列表推导式28
2
8
l 阿凡提与国王比赛下棋,国王说要是自己输了的话阿
凡提想要什么他都可以拿得出来。阿凡提说那就要点
米吧,棋盘一共64个小格子,在第一个格子里放1粒
米,第二个格子里放2粒米,第三个格子里放4粒米,
第四个格子里放8粒米,以此类推,后面每个格子里
的米都是前一个格子里的2倍,一直把64个格子都放
满。需要多少粒米呢?
>>> sum([2**i for i in range(64)])
18446744073709551615
>>> int('1'*64, 2)
18446744073709551615
列表推导式引例
列表与列表推导式2
29
9
列表推导式-1
l 列表推导式使用非常简洁的方式来快速生成满足特定
需求的列表,代码具有非常强的可读性
l 列表推导式语法形式为:
[expression for expr1 in sequence1 if condition1
for expr2 in sequence2 if condition2
for expr3 in sequence3 if condition3
...
for exprN in sequenceN if conditionN]
l 列表推导式实质上是一个形式简洁的循环结构,例如:
>>> aList = [x*x for x in range(10)]
相当于
>>> aList = []
>>> for x in range(10):
aList.append(x*x)
也相当于
>>> aList = list(map(lambda x: x*x, range(10)))
列表与列表推导式30
3
0
列表推导式-2
l 列表推导式中可以使用函数或复杂表达式
>>> def f(v):
if v%2 == 0:
v = v**2
else:
v = v+1
return v
>>> [f(v) for v in [2, 3, 4, -1] if v>0]
[4, 4, 16]
>>> [v**2 if v%2 == 0 else v+1 for v in [2, 3, 4, -1] if v>0]
[4, 4, 16]
>>> x = list(range(10))
>>> [item>5 for item in x]
[False, False, False, False, False, False, True, True, True, True]
列表与列表推导式3
1
3
1
列表推导式应用-1
l 使用列表推导式实现嵌套列表的平铺
>>> 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]
这行语句相当于
>>> result = []
>>> for elem in vec:
for num in elem:
result.append(num)
>>> result
l 使用列表推导式过滤符合条件的元素
#列出当前文件夹下所有Python源文件
>>> import os
>>> [filename for filename in os.listdir('.') if
filename.endswith('.py')]
#从列表中选择符合条件的元素组成新的列表
>>> aList = [-1, -4, 6, 7.5, -2.3, 9, -11]
>
>>
[i
fo
r i
in aList if i>0]
#所有大于0的数字
列表与列
式3
2
3
2
列表推导式应用示例
l 已知有一个包含一些同学成绩的字典,计算成绩的最
高分、最低分、平均分,并查找所有最高分同学
>>> 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) #平均分
>>> highestPerson = [name for name, score in scores.items() if
score == highest]
#生成所有最高分同学组成的列表
l 列表推导式查找列表中最大元素的位置:
>>> from random import randint
>>> x = [randint(1, 10) for i in range(20)]
#随机数列表
>>> x
[10, 2, 3, 4, 5, 10, 10, 9, 2, 4, 10, 8, 2, 2, 9, 7, 6, 2, 5, 6]
>>> m = max(x) #最大值
>>> [index for index, value in enumerate(x) if value == m]#生成最
大元素的位置列表
[
0,
5,
6,
10
]
列表与列
式33
3
3
列表推导式应用-2
l 列表推导式中使用多个循环实现多序列元素的任意组
合,并且可以结合条件语句过滤特定元素。
>>> [(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)]
l 注意:对于包含多个循环的列表推导式,一定要清楚
多个循环的执行顺序或"嵌套关系"。例如,上面的代
码等价于
>>> result = []
>>> for x in [1, 2, 3]:
for y in [3, 1, 4]:
if x != y:
result.append((x,y))
#使用列表推导式生成100以内的所有素数
>>> [p for p in range(2, 100) if 0 not in [p%d for d in range(2,
int(p**0.5)+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]
列表与列表推导式3
4
34
列表推导式应用-3
l 使用列表推导式实现矩阵转置
>>> 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]]
#也可以使用内置函数来实现矩阵转置
>>>list(zip(*matrix))
#序列解包
[(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
l 列表推导式支持文件对象迭代
>>> with open('C:\\FileTest.java', 'r') as fp:
print([line for line in fp])
列表与列表推导式
posted @ 2022-01-10 19:38  我的未来姓栗山  阅读(71)  评论(0编辑  收藏  举报