简而言之,列表解析把任意 一个表达式而不是一个函数应用于一个
可迭代对象中的元素
实例引入
Python的内置 ord函数会返回一个单个字符的ASCII整数编码,现在,假设我们希望收集整个字符串中的所有字符的ASCII编码。
1.for循环
也许最直接的方法就是使用一个简单的for循环,并将结果附加在列表中:
res=[]
for x in 'sapm':
res.append(ord(x))
>>>res
[115, 112, 97, 109)
2.map函数
再来用map函数试一下,map把一个函数映射遍一个序列并收集结果
>>>res = list(map(ord, 'spam ' ))
>>>res
>[115, 112, 97, 109]
3.列表解析
最后使用列表解析,列表解析把一个表达式映射遍一个序列:
>>>res = [ord(x) for x in 'spam ']
>>>res
> [115, 112, 97, 109)
列表解析在一个序列的值上应用一个任意表达式,将其结果收集到一个新的列表中并返回。从语法上来说,列·表解析是由方括号封装起来的(为了提醒你它们构造了一个列表)。
下面我们收集了从0~9数字的平方,再来体验一下列表解析
>>>[x**2 for x in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
增加分支语句和循环
例如,求0~9所有偶数的平方
>>>[ x**2 for x in range(10) if x % 2 == 0]
> [0, 4, 16, 36, 64]
'''
若在右边的if中得到的是假的话. for循环就
会跳过这些数字,并且用左边的表达式来计算
'''
当for分句嵌套在列表解析中肘, 它们工作起来就像等效的嵌套的for循环语句。例如, 如下代码
>>>res = [x + y for x in [0, 1, 2] for y in [100, 200, 300])
>>>res
[100, 200, 300, 101, 201, 301, 102, 202, 302)
与下文如此冗长的代码有相同的效果。
>>>res = []
>>>for x in [0, 1, 2]:
for y in [100, 200, 300] :
res.append(x + y)
>>>res
[100, 200, 300, 101, 201, 301, 102, 202, 302]
列表解析与矩阵
如下定义了两个矩阵
>>>M= [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
>>>N = [[2, 2, 2],
[3, 3, 3],
[4, 4, 4]]
>>>[row[l] for row in M]
[2, 5, 8]
>>>[M[row][1] for row in (0, 1, 2)]
[2, 5, 8]
复杂点的
>>>[[M[row][col] * N[row][col] for col in range(3)] for row in range(3)]
[[2, 4, 6], [12, 15, 18], [28, 32, 36]]
#row迭代的是外层循环。对于每个row,它运行嵌套的列的选代来创建矩阵每一行的结果
等效代码如下
>>>res = []
>>>for row in range(3):
tmp = []
for col in range(3):
tmp.append(M[row][col] * N[row][col])
res.append(tmp)
>>>res
[[2, 4, 6], [12, 15, 18], [28, 32, 36]]