我在Leetcode 867中遇到一个奇怪的错误。转置矩阵。
问题是
给出矩阵A,返回A的转置。
矩阵的转置是将矩阵翻转到其主对角线上,从而切换矩阵的行索引和列索引。
示例1:
输入:[[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]] 示例2:
输入:[[1,2,3],[4,5,6]] 输出:[[1,4],[2,5],[3,6]]
给出正确的代码是
`res = [[None] * len(A) for _ in range(len(A[0]))]
#res = [[None] * len(A)] * len(A[0]) # why this doesn't work
for r, row in enumerate(A):
for c, val in enumerate(row):
res[c][r] = val
return res`
我的解决方法是
`res = [[None] * len(A)] * len(A[0]) # why this doesn't work
for r, row in enumerate(A):
for c, val in enumerate(row):
res[c][r] = val
return res`
给出输入和输出为 您的输入 [[1,2,3],[4,5,6]] 输出量 [[3,6],[3,6],[3,6]] 预期 [[1,4],[2,5],[3,6]]
**我的解决方案和正确答案之间的唯一区别是**
`res = [[None] * len(A) for _ in range(len(A[0]))]
res = [[None] * len(A)] * len(A[0]) # why this doesn't work`
**为什么第二行不起作用? **
[[None] * len(A) for _ in range(len(A[0]))] == [[None] * len(A)] * len(A[0])
返回True
答案 0 :(得分:0)
这是因为
res = [[None] * len(A) for _ in range(len(A[0]))]
创建一个包含len(A [0])个不同列表的列表,而
res = [[None] * len(A)] * len(A[0]) # why this doesn't work
创建一个包含对同一列表的len(A [0])引用的列表,以便在其中一个值中修改值会在所有这些值中对其进行修改。
另请参见List of lists changes reflected across sublists unexpectedly ...