Проблема с перебором списка списков - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь вычислить транспонирование матрицы, которая у меня есть в виде списка списков. Исходная матрица m n, я создал матрицу n m. Проблема появляется когда начинаю использовать вложенный l oop.

m = 0
for i in range(0, rows):
    for j in range(0, columns):
        final1[j][i] = m
        print(final1)
        m += 1

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

[[0, None, None, None], [0, None, None, None], [0, None, None, None]]
[[1, None, None, None], [1, None, None, None], [1, None, None, None]]
[[2, None, None, None], [2, None, None, None], [2, None, None, None]]
[[2, 3, None, None], [2, 3, None, None], [2, 3, None, None]]

Итак, получив доступ к final [j] [i], в позиции j = 0, i = 0 значения final [1] [0 ] и final [2] [0] также меняются. Как этого избежать? и сделайте первые 4 строки этого формата:

[[0, None, None, None], [None, None, None, None], [None, None, None, None]]
[[0, None, None, None], [1, None, None, None], [None, None, None, None]]
[[0, None, None, None], [1, None, None, None], [2, None, None, None]]
[[0, 3, None, None], [1, None, None, None], [2, None, None, None]]
rows = int(input())
columns = int(input())
final1 = [[None] * rows] * columns

Так я объявляю final1

Ответы [ 2 ]

2 голосов
/ 27 мая 2020

Это происходит потому, что оператор объявления внутренне эквивалентен добавлению единственного списка ([None]*rows) column раз в список final1.

Если вы знакомы с проблемой копирования, это почти то же самое. Все списки внутри final1 являются одинаковыми списками с точки зрения памяти, которую они представляют.

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

Примечание: Фактически вы создаете список списков с column количеством строк и row количеством столбцов.

Вы можете решить эту проблему, объявив final1 следующим образом:

final1 = [[None for i in range(rows)] for j in range(columns)]

ps: Я использовал строки внутри и столбцы снаружи, просто чтобы сделать это как альтернативу вашему объявлению. Он по-прежнему создает список списков с column количеством строк и row количеством столбцов

1 голос
/ 27 мая 2020

Это работает:

rows = int(input())
columns = int(input())
final1 = [[None for i in range(rows)] for j in range(columns)]

m = 0
for i in range(rows):
    for j in range(columns):
        final1[j][i] = m
        m += 1

print(final1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...