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

#python #arrays #list

#python #массивы #Список

Вопрос:

Я обрабатываю 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
  

Спасибо

Комментарии:

1. Можете ли вы добавить ожидаемый результат, пожалуйста

2. Значение b равно [] итак, b[i] = empty вы не можете получить доступ к b[i] [j], вам нужно выполнить b[i] = [] и после b[i] [j] = a[i] [j]

3. @ArnaudWurmel Теперь я получаю ошибку «Ошибка индекса: индекс назначения списка вне диапазона:

4. Какова цель сравнения if a[0][0] == 'a' каждый раз в цикле? Или это упрощение для нас?

Ответ №1:

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

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

В следующем примере используется enumerate функция. Он возвращает индекс и элемент, поэтому, если вы хотите, вы все равно можете что-то делать с i и j, но это помешает вам получить an 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. Если это просто упрощение процесса, просто игнорируйте это замечание.

Комментарии:

1. Спасибо за объяснение. Это было очень полезно.

Ответ №2:

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

Ответ №3:

Я не имею ни малейшего представления о вашем ожидаемом выходе. Я только что исправил ошибку. Сначала 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)
  

Комментарии:

1. Спасибо за ваш ответ. Это было очень умно.