Python: индекс индекса вне диапазона (присвоение 2D-списка другому 2D-списку)

Я обрабатываю 2D-список и хочу сохранить обработанный 2D-список в новом 2D-списке с одинаковыми индексами. Но, я получаю ошибку «индекс списка вне диапазона»

Я упростил свой код, чтобы было легко понять:

a = [ ['a', 'b'], ['c', 'd'] ] print a b = [] for i in range(len(a)): for j in range(len(a[i])): if a[0][0] == 'a': a[0][0] = 'b' else: b[i][j] = a[i][j] #list index out of range 

благодаря

В b[i][j] вы пытаетесь получить доступ к j-му элементу i-го элемента. Однако b является просто пустым списком, поэтому i-й элемент не существует, не говоря уже о j-ом элементе этого i-го элемента.

Вы можете исправить это, добавив элементы в b. Но сначала список (строка) должен быть создан (добавлен к b) для каждого списка (строки) в a.

В следующем примере используется функция enumerate . Он возвращает индекс и элемент, поэтому, если вы хотите, вы все равно можете делать вещи с i и j, но это не позволит вам получить IndexError . Вы все же можете безопасно использовать a[i][j] , потому что индексы выведены из a .

 a = [ ['a', 'b'], ['c', 'd'] ] b = [] for i, row in enumerate(a): # loop over each list (row) in a b_row = [] # list (row) which will be added to b for j, element in enumerate(row): # loop over each element in each list (row) in a if a[0][0] == 'a': # Not sure why each the first element of a has to be checked each loop # Probably a simplification of the operations. a[0][0] = 'b' else: b_row.append(element) # append the element to the list(row) that will be added to b b.append(b_row) # When the row is filled, add it to b print(b) 

Один последний комментарий: не рекомендуется менять список, перебирая его в Python (например, в инструкции if ). Лучше применить эти изменения к вашему выходному списку, то есть b. Если это упрощение процесса, просто игнорируйте это замечание.

Я не имею ни малейшего представления о вашем ожидаемом выходе. Я только что исправил ошибку. Сначала append пустой list в b затем вы можете получить доступ к b[i] и так далее.

Код:

 a = [ ['a', 'b'], ['c', 'd'] ] print(a) b = [] for i in range(len(a)): b.append([]) #Append an empty list to `b` for j in range(len(a[i])): if a[0][0] == 'a': a[0][0] = 'b' else: b[i].append(a[i][j]) #No error now print(b) 

Простой, вы инициализировали b до [], поэтому любая попытка доступа к нему по индексу будет вне диапазона. Списки в Python могут динамически увеличиваться, но это не так, как вы это делаете. Вам нужно .append