Добавление списка в список несколько раз с сохранением возможности изменения определенного элемента в Python - PullRequest
0 голосов
/ 04 февраля 2019

Я хочу создать сетку с переменным количеством строк и столбцов.Что я сделал, чтобы добиться этого, так это

BaseRow = []
for j in range (0, columns):
    BaseRow.append(0)
Grid = []
for j in range (0, rows):
    Grid.append(BaseRow)

Так что все до сих пор кажется нормальным, я печатаю строки по порядку с этим фрагментом кода

for i in range (1, rows+1):
    print Grid[rows-i]

и сеткой, которая выглядитчто-то вроде этого

[0, 0, 0]
[0, 0, 0]
[0, 0, 0]

напечатано.Дело в том, что после этого я хочу изменить определенный элемент.Но когда я это сделаю,

Grid[0][0] = 1

и напечатаю снова, вместо того, чтобы просто изменить крайний правый угол вниз с 0 на 1, весь столбец изменится, и он станет

[1, 0, 0]
[1, 0, 0]
[1, 0, 0]

Я подозреваюон видит, что Grid берет из BaseRow, поэтому он меняет BaseRow, а затем Grid берет строки из BaseRow и просто помещает это значение везде.Я подозреваю, что .append, возможно, не то, что я ищу, но за все исследования, которые я провел, мне не удалось найти что-то еще для использования.Если я правильно понимаю, .extend добавит его не как список, а как отдельные номера.Что я должен изменить, или как мне это структурировать?

Пожалуйста, извините за мои ограниченные знания, я только начал программировать на python пол недели назад.Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Если вы спросите меня, я в любой день воспользуюсь пониманием Списка, потому что это так чисто и просто:

columns, rows = 3, 3

lst = [[0 for j in range(columns)] for i in range(rows)] # List of List with 3 Columns and 3 Rows
lst[0][0] = 1                                            # modifying a member
print (lst)                                              # Print the result

# Result: [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
0 голосов
/ 04 февраля 2019

Лично я предпочитаю понимание списка, но ваш код нуждается в небольших изменениях, и он будет вам полезен.Вы добавляете список, и к этому списку вы добавляете элементы:

matrix = []
for i in range(3):
    matrix.append([])
        for j in range(4):
            matrix[-1].append(0)

print(matrix)
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
matrix[0][0] = 1
print(matrix)
[[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
0 голосов
/ 04 февраля 2019
BaseRow = []
for j in range (0, columns):
    BaseRow.append(0)
Grid = []
for j in range (0, rows):
    Grid.append(BaseRow)

Когда вы делаете это, один и тот же экземпляр BaseRow добавляется в Grid несколько раз.Таким образом, если вы измените четную строку в Grid, эффект будет на всех строках, так как это в основном один и тот же экземпляр списка во всех строках.

Если вы хотите, чтобы копия BaseRow добавлялась в Grid,используйте следующий код:

for j in range(0, rows):
    Grid.append(BaseRow[:])

Вы также можете использовать понимание списка:

Grid = [[0 for j in range(0, columns)] for i in range(0, rows)]

Вывод для Columns = 3 и rows = 4:

[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

Вывод после настройки Grid[0][0] = 1:

[[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...