Может кто-нибудь помочь мне найти ошибку в моем коде? Если я создаю пустую 2D-матрицу со статическим начальным значением, она возвращает правильную транспонированную матрицу. А если я создам пустую матрицу с помощью цикла for, она вернет последнюю строку для всех строк в ответе.
# Original Matrix :
[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
# Expected Transpose :
[[1, 4, 7],
[2, 5, 8],
[3, 6, 9]]
# Actual Transpose :
[[3, 6, 9],
[3, 6, 9],
[3, 6, 9]]
# Transpose Matrix
def transpose_mtx(original):
t_cols = len(original)
t_rows = len(original[0])
# creating a blank matrix with 0s of transpose shape
row = [0 for _ in range(t_cols)]
t_mtx = [row for _ in range(t_rows)]
# t_mtx = [[0,0,0],[0,0,0], [0,0,0]]
# if I keep this line instead, it returns correct answer
# rows of original
for i in range(len(original)):
# columns of original
for j in range(len(original[0])):
# interchange items
t_mtx[j][i] = original[i][j]
return t_mtx
my_mtx = [[1,2, 3],
[4, 5, 6],
[7, 8, 9]]
print(transpose_mtx(my_mtx))
Понятно ! Большое спасибо. Это сработало. Один и тот же объект списка «строка» изменен на отдельные копии списка для строк.
Вам необходимо инициализировать пустую матрицу, создав отдельные списки для каждой строки транспонированной матрицы.
# Creating a blank matrix with 0s of transpose shape
t_mtx = [[0 for _ in range(t_cols)] for _ in range(t_rows)]
Большое спасибо ! Это сработало. Таким образом, по сути, проблема заключается в том, что один и тот же объект списка «строка» снова используется для всех строк, поскольку дальнейшие изменения распространяются повсюду, поскольку список изменчив.
Проблема в том, что вы используете список как элемент списка (как и должно быть в матрице), но проблема здесь в том, что вы используете все строки как один и тот же список (то есть row
), и если вы знаете, что списки являются изменяемыми, что означает, что они могут обновляться откуда угодно, и они будут меняться для всех ссылок на них.
Теперь в этом случае t_mtx использует все строки как один и тот же список ссылок (row
), что означает, что каждый раз, когда вы обновляете любую строку, он обновляет все строки, поэтому все ваши строки такие же, как и последняя строка.
Итак, здесь вы можете либо каждый раз создавать новую строку, либо использовать метод .copy() для создания новой копии списка строк.
t_mtx = [row.copy() for _ in range(t_rows)]
ВЫХОД
Надеюсь, вы понимаете, извините за мой плохой английский.
Понятно ! Большое спасибо. Это сработало 🙌 Я почесал голову, проверяя вручную все внутренние циклы, чтобы найти, где что-то идет не так, и потратил 2 часа. Но в конце концов ваш ответ помог. Таким образом, по сути, проблема заключается в том, что один и тот же объект списка «строка» снова используется для всех строк, поскольку дальнейшие изменения распространяются повсюду, поскольку список изменчив. Еще раз спасибо !
Вы создаете список t_mtx, который имеет 3 копии одного и того же подсписка. Итак, изменения распространяются. Кстати, вместо списков списков Python вы должны использовать массив Numpy для матрицы, а затем его можно будет транспонировать напрямую.