Python создать пустой 2-мерный массив - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь сгенерировать пустой двумерный массив с помощью циклов for. Я нашел один метод, который работает, и он выглядит так:

rows = 5
cols = 5
grid1 = []
grid1 = [[0 for i in range(cols)] for j in range(rows)] 
print(grid1)

Вывод:

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

Однако, когда я пытаюсь записать циклы for в "нормальном" синтаксисе, он выдает ошибку. Почему я не могу написать его в обычном синтаксисе?

rows = 5
cols = 5

grid2 = []
for i in range(rows):
    for j in range(cols):
        grid2[i][j] = 0
print(grid2)

Вывод:

Exception has occurred: IndexError
list index out of range
  File "C:\Users\Bruker\Downloads\test.py", line 8, in <module>
    grid2[i][j] = 0

Ответы [ 5 ]

2 голосов
/ 03 апреля 2020

Вы получаете IndexError, потому что вы не можете назначить индекс в списке сверх текущей длины списка. Так как grid2 инициализируется в пустой список, любая попытка индексировать его вызовет эту ошибку.

Один правильный способ написать ваше понимание вложенного списка, используя циклы for, состоит в том, чтобы сначала создать внутренний список для каждой строки. тогда append это до grid2:

grid2 = []
for i in range(rows):
    inner = []
    for j in range(cols):
        inner.append(0)
    grid2.append(inner)
0 голосов
/ 03 апреля 2020

вы должны инициализировать grid2 = np.empty ([rows, cols]) вместо этого, пожалуйста, обратитесь к https://docs.scipy.org/doc/numpy/reference/generated/numpy.empty.html#numpy .empty для более подробной информации

0 голосов
/ 03 апреля 2020

Вам нужно использовать .append() функцию для добавления элементов в список.

grid2 = []
for i in range(rows):
    grid2.append([])
    for j in range(cols):
        grid2[i].append(0)
print(grid2)

более эффективно:

grid2 = [[0]*cols] * rows
0 голосов
/ 03 апреля 2020

вы пытаетесь получить доступ ко второму «измерению» или внутреннему l oop, не создавая здесь, вы можете использовать:

rows = 5
cols = 5

grid2 = []
for _ in range(rows):
    grid2.append([])
    for _ in range(cols):
        grid2[-1].append(0)
print(grid2)

или можете использовать:

grid2 = []
for _ in range(rows):
    grid2.append([0] * cols)
0 голосов
/ 03 апреля 2020

В первом случае каждая ячейка существует, так что вы можете получить к ним доступ по индексу, но во втором случае они еще не существуют, другой способ -

grid2 = []
for i in range(rows):
    tmp = []
    for j in range(cols):
        tmp.append(0)
    grid2.append(tmp)

И фактически, если вы уменьшите это код, когда у вас есть следующее, и сокращение снова с другим пониманием списка у вас есть ваш первый код

grid2 = []
for i in range(rows):
    grid2.append([0 for j in range(cols)])
...