Почему этот итеративный код увеличения списка выдает IndexError: индекс назначения списка вне диапазона? Как я могу повторно добавлять (дописывать) элементы в список?

#python #list #exception

#python #Список #исключение

Вопрос:

Я пытался написать какой-то код, например:

 i = [1, 2, 3, 5, 8, 13]
j = []
k = 0

for l in i:
    j[k] = l
    k  = 1
  

Но я получаю сообщение об ошибке, в котором говорится IndexError: list assignment index out of range , ссылаясь на j[k] = l строку кода. Почему это происходит? Как я могу это исправить?

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

1. append является правильным решением для вашего варианта использования, однако в python list есть метод insert, который может вставляться непосредственно в i-ю позицию в списке. j.insert(k, l)

2. Могу ли я спросить, почему решение OP не будет работать? Зачем использовать append?

Ответ №1:

j это пустой список, но вы пытаетесь записать в элемент [0] на первой итерации, который еще не существует.

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

 for l in i:
    j.append(l)
  

Конечно, вы бы никогда не сделали этого на практике, если бы все, что вы хотели сделать, это скопировать существующий список. Вы бы просто сделали:

 j = list(i)
  

В качестве альтернативы, если вы хотите использовать список Python как массив на других языках, вы могли бы предварительно создать список, для элементов которого установлено значение null ( None в примере ниже), а позже перезаписать значения в определенных позициях:

 i = [1, 2, 3, 5, 8, 13]
j = [None] * len(i)
#j == [None, None, None, None, None, None]
k = 0

for l in i:
   j[k] = l
   k  = 1
  

Следует понимать, что list объект не позволит вам присвоить значение индексу, который не существует.

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

1. Хорошо, большое вам спасибо. Я не знал, какой из них похвалить, поскольку есть три почти одинаковых ответа. Я думаю, это наиболее описательно. Приветствия

2. Я вижу, что это может быть очень запутанным для тех, кто приходит с других языков, таких как PHP или C. j — это тип списка, а не массива. С типом списка я не думаю, что это доступно для подписки. Очень запутанный, если исходить из других языков.

3. @Nguaial Тип списка доступен для подписки, но вы можете получить доступ только к уже существующим элементам — вы не можете создать элемент, пытаясь записать в индекс, который находится вне диапазона. j[0] = «foo» будет работать, если в списке уже есть хотя бы один элемент.

4. Мне интересно о причинах такого дизайнерского решения…

5. после использования append он показывает ошибку не удается назначить вызов функции

Ответ №2:

Другой ваш вариант — инициализировать j :

 j = [None] * len(i)
  

Ответ №3:

Делать j.append(l) вместо j[k] = l и вообще избегать k .

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

1. Более короткий (более питонический?) способ может быть j =[l]

2. @BlaXpirit: Я думаю, это создаст нагрузку на сборщик мусора.

3. @BalXpirit: Учитывая, что это экономит всего несколько символов (тем более, что вам нужно добавить пробелы, чтобы это было приемлемо), и это .append гораздо более распространено (возможно, по какой-то причине — я думаю, что это немного легче понять), на самом деле ни в коем случае не превосходит. (Редактировать @khachik: Нет, = изменяет на месте)

Ответ №4:

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

 j = [l for l in i]
  

или сделать его копию с помощью инструкции:

 j = i[:]
  

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

1. эта вторая конструкция аккуратна

2. Если единственной целью является копирование списка, вы можете просто сказать j = list (i) Я думаю, что вопрос скорее в поведении списков, чем в том, что конкретно требуется способ копирования элементов.

Ответ №5:

 j.append(l)
  

Также избегайте использования строчных букв «L», потому что их легко спутать с 1

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

1. В моноширинном шрифте l сильно отличается от 1

2. Для меня это не так.

Ответ №6:

Я думаю, что метод Python insert — это то, что вы ищете:

Вставляет элемент x в позицию i. list.insert(i, x)

 array = [1,2,3,4,5]
# array.insert(index, element)
array.insert(1,20)

print(array)

# prints [1,20,2,3,4,5]
  

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

1. Нет смысла использовать insert when append было предоставлено специально для этой цели.

2. С точки зрения информации, ваш код фактически печатается [1, 20, 2, 3, 4, 5] .

3. Вы вставили в индекс 1, переместив индексы 1 и далее. Вставленное значение не попадает в индекс 2. Iist.insert() действительно нужен только тогда, когда вы не хотите добавлять элемент в конец списка; вопрос здесь именно в этом, поэтому list.append() предпочтительнее.

4. На самом деле, почему я так отвечаю на этот вопрос, я тоже удивлен : D Не знаю, что я подумал 🙂 Это именно «list.append ()», который является принятым ответом. Я думаю, что это помогает людям или дает идею для решения их проблем, поэтому он получает 5 обращений.

Ответ №7:

Вы могли бы использовать словарь (аналогичный ассоциативному массиву) для j

 i = [1, 2, 3, 5, 8, 13]
j = {} #initiate as dictionary
k = 0

for l in i:
    j[k] = l
    k  = 1

print(j)
  

будет выводить :

 {0: 1, 1: 2, 2: 3, 3: 5, 4: 8, 5: 13}
  

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

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

Ответ №8:

Еще один способ:

 j=i[0]
for k in range(1,len(i)):
    j = numpy.vstack([j,i[k]])
  

В этом случае j будет numpy массив

Ответ №9:

Возможно, вам нужно расширить()

 i=[1,3,5,7]
j=[]
j.extend(i)