我真的不明白这里的逻辑……。
def transpose(A):
output = [['']*len(A)] * len(A[0])
for j in range(len(A[0])):
for i in range(len(A)):
output[j][i] = A[i][j]
return output
输入:[[1,2,3],[4,5,6],[7,8,9]]
预期输出:[[1,4,7],[2,5,8],[3,6,9]]
我的输出:[[3,6,9], [3,6,9], [3,6,9]]
我知道我可以使用zip轻松解决此问题,但是我只想知道为什么此代码将返回重复的列表。
新更新,我添加了一些印刷品以了解该过程
def transpose(A):
output = [['']*len(A)] * len(A[0])
for j in range(len(A[0])):
for i in range(len(A)):
output[j][i] = A[i][j]
print(j)
print(i)
print(output)
return output
输出为:
0
0
[[1, '', ''], [1, '', ''], [1, '', '']]
0
1
[[1, 4, ''], [1, 4, ''], [1, 4, '']]
0
2
[[1, 4, 7], [1, 4, 7], [1, 4, 7]]
1
0
[[2, 4, 7], [2, 4, 7], [2, 4, 7]]
1
1
[[2, 5, 7], [2, 5, 7], [2, 5, 7]]
1
2
[[2, 5, 8], [2, 5, 8], [2, 5, 8]]
2
0
[[3, 5, 8], [3, 5, 8], [3, 5, 8]]
2
1
[[3, 6, 8], [3, 6, 8], [3, 6, 8]]
2
2
[[3, 6, 9], [3, 6, 9], [3, 6, 9]]
[[3, 6, 9], [3, 6, 9], [3, 6, 9]]
例如,循环的第一步。 j = 0和i =0。但是,输出[0] [0],输出[1] [0]和输出[2] [0]都被循环更改。为什么会这样??????
我现在很困惑。我已经用Java编写了相同的代码,并且可以正常运行。
public class TransposeMatrix {
public static int[][] transpose(int[][] A) {
int[][] result = new int[A[0].length][A.length];
for (int j = 0; j < A[0].length; j++) {
for (int i = 0; i < A.length; i++) result[j][i] = A[i][j];
}
return result;
}
}
答案 0 :(得分:1)
当您像这样在python中增加列表时,实际上并没有创建新列表,而是对同一列表的多个引用。因此,当您更改一个列表中的值时,您也更改了其他列表中的值。这就是为什么您的输出为[[3,6,9], [3,6,9], [3,6,9]]
的原因;它只是三个列表中的最后一个(即,从for循环的最后一个值开始)。
相反,您可以执行以下操作:
def transpose(A):
output = [['']* (len(A)) for y in range(len(A[0]))]
# or: output = [['' for x in range(len(A))] for y in range(len(A[0]))]
for j in range(len(A[0])):
for i in range(len(A)):
output[j][i] = A[i][j]
return output
transpose([[1,2,3],[4,5,6],[7,8,9]])
返回[[1,4,7],[2,5,8],[3,6,9]]
。
希望这会有所帮助!