矩阵转置没有numpy,错误:列表索引超出范围[重复]

问题描述 投票:-2回答:3

这个问题在这里已有答案:

我想做一个矩阵的转置。我不想使用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
python python-3.x
3个回答
2
投票

你可以使用transposezip*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)]

0
投票

简单的循环方式:

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
投票

在你的代码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]]
© www.soinside.com 2019 - 2024. All rights reserved.