Leetcode 867. Транспонировать матрицу; Debug; Создать список - PullRequest
0 голосов
/ 18 марта 2019

Я встречаю странную ошибку в 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

1 Ответ

0 голосов
/ 25 марта 2019

Это потому что

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]) на тот же список, так что изменение значения в одном из них изменяет его во всех из них.

См. Список изменений списков, неожиданно отраженных в подсписках среди прочих ...

...