这个问题在这里已有答案:
我想做一个矩阵的转置。我不想使用numpy。我收到以下错误,(下面的代码)。任何帮助表示赞赏
matrix = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
transposed = []
for i in range(7):
new=[]
for row in matrix:
new.append(row[i])
transposed.append(lst)
print(transposed)
错误:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-106-856d3ec27942> in <module>()
6 new=[]
7 for row in matrix:
----> 8 new.append(row[i])
9 transposed.append(lst)
10 print(transposed)
IndexError: list index out of range
你可以使用transpose
和zip
在*unpacking
列出一个很酷的衬里列表:
m = [[1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3]]
list(zip(*m))
输出:
[(1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3), (1, 2, 3)]
简单的循环方式:
matrix = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
print([[matrix[j][i] for j in range(len(matrix))] for i in range(len(matrix[0]))])
# [[1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3]]
或者zip
:
matrix = [[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3]]
print(list(map(list, zip(*matrix))))
# [[1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3]]
在你的代码0 <= i <7,但是一行的长度为3. @ giser_yugang的答案是正确的,你也可以使用zip:
transposed= list(zip(*matrix))
*:将矩阵分解为其元素,即其行; zip:将行元素分组为列为元组;
print(transposed)
Out: [(1, 1, 1, 1, 1, 1, 1), (2, 2, 2, 2, 2, 2, 2), (3, 3, 3, 3, 3, 3, 3)]
或者您可以将元组转换为列表:
transposed=[ list(e) for e in zip(*matrix)]
print(transposed)
Out: [[1, 1, 1, 1, 1, 1, 1], [2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3]]