#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
whenappend
было предоставлено специально для этой цели.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)