#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. Спасибо за ваш ответ. Это было очень умно.