列表推导式实现矩阵转置的解析代码
上次解析的那个推导式还是过于简单,这次换点新的推导式。推导式怎么说呢,挺好用的,简洁,明不明了咱不说,因人而异啦。让代码更清晰,我觉得才是我所追求的,话不多说,直接先看代码。
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
print([[row[i] for row in matrix] for i in range(4)])
# 输出[[1,5,9].[2,6,10],[3,7,11],[4,8,12]]
从上面看起来,列表推导式是真的很简洁,也算的上很清晰了,不过你可以看懂上面串推导式的话,下面这个你大致也不需要看下去了,没什么帮助,顶多你就是看一下我解析这串推导式的思路。
其实关于这个推导式,我们还可以使用python的内置函数来实现矩阵转置
(我个人认为嚯,能少用内置就少用内置,我个人喜欢实打实自己写出来的东西)
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
list(map(list,zip(*matrix)))
# 输出和上面的输出一样
重头戏来了,开始解析
matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
aml, amt = [], []
for i in range(4): # i做为索引
for row in matrix: # 循环列表输出,输出是一维的列表
aml.append(row[i]) # 完空的列表aml里面添加元素
amt.append(aml[:])
aml.clear()
print(amt)
如上就是我个人思路的解析了,可能有人会不明白插入aml的时候为什么要加一个切片,首先我们必须知道,list.append()是往列表追加元素,如果你不加切片的话,你直接是amt.append(aml)的话,输出就是错误的,切片是让元素添加的时候按步骤来,一步一步走,新添加的元素不会干扰到旧的元素。其实这个就是一个浅拷贝和深拷贝的问题,这是很多语言都会有的问题,这里不细说了。(js的浅拷贝和深拷贝最为明显)。
这次写主要是看代码思路,很多时候不懂的时候,设置断点,慢慢看,不要,代码也就是看多了就懂了,看多了还不懂,那就算了吧,不要勉强自己了。