Почему все строки моей матрицы такие же, как последняя строка?

Может кто-нибудь помочь мне найти ошибку в моем коде? Если я создаю пустую 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))

Вы создаете список t_mtx, который имеет 3 копии одного и того же подсписка. Итак, изменения распространяются. Кстати, вместо списков списков Python вы должны использовать массив Numpy для матрицы, а затем его можно будет транспонировать напрямую.

user19077881 14.07.2024 10:13

Понятно ! Большое спасибо. Это сработало. Один и тот же объект списка «строка» изменен на отдельные копии списка для строк.

Suyash Nachankar 14.07.2024 10:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам необходимо инициализировать пустую матрицу, создав отдельные списки для каждой строки транспонированной матрицы.

# Creating a blank matrix with 0s of transpose shape
t_mtx = [[0 for _ in range(t_cols)] for _ in range(t_rows)]

Большое спасибо ! Это сработало. Таким образом, по сути, проблема заключается в том, что один и тот же объект списка «строка» снова используется для всех строк, поскольку дальнейшие изменения распространяются повсюду, поскольку список изменчив.

Suyash Nachankar 14.07.2024 10:51
Ответ принят как подходящий

Проблема в том, что вы используете список как элемент списка (как и должно быть в матрице), но проблема здесь в том, что вы используете все строки как один и тот же список (то есть row), и если вы знаете, что списки являются изменяемыми, что означает, что они могут обновляться откуда угодно, и они будут меняться для всех ссылок на них.

Теперь в этом случае t_mtx использует все строки как один и тот же список ссылок (row), что означает, что каждый раз, когда вы обновляете любую строку, он обновляет все строки, поэтому все ваши строки такие же, как и последняя строка.

Итак, здесь вы можете либо каждый раз создавать новую строку, либо использовать метод .copy() для создания новой копии списка строк.

t_mtx = [row.copy() for _ in range(t_rows)]

ВЫХОД

Надеюсь, вы понимаете, извините за мой плохой английский.

Понятно ! Большое спасибо. Это сработало 🙌 Я почесал голову, проверяя вручную все внутренние циклы, чтобы найти, где что-то идет не так, и потратил 2 часа. Но в конце концов ваш ответ помог. Таким образом, по сути, проблема заключается в том, что один и тот же объект списка «строка» снова используется для всех строк, поскольку дальнейшие изменения распространяются повсюду, поскольку список изменчив. Еще раз спасибо !

Suyash Nachankar 14.07.2024 10:47

Другие вопросы по теме