Ошибка присвоения индекса списка Python вне диапазона

#python #list

#python #Список

Вопрос:

Я новичок в Python и сталкиваюсь со следующим сообщением об ошибке:

 "products[j] = (num_list[(num_length - 2 - i)]) * 2
IndexError: list assignment index out of range"
 

при выполнении следующего кода:

   def checksum():
    products = []
    i = 0
    j=0


    if num_length % 2 == 0:
        num_type = "even"
    else:
        num_type = "odd"
    print(f"DEBUG- {num_length}")
    print(num_list[2])

    while True:
        products[j] = (num_list[(num_length - 2 - i)]) * 2
        if num_type=="even" and (num_length - 2 - i) == 0:
            break
        elif (num_length - 2 - i) == 1:
            break
        i =2
        j  =1




main()
 

Похоже, что код завершается ошибкой при выполнении первой итерации следующего назначения списка:

 products[j] = (num_list[(num_length - 2 - i)]) * 2
 

однако значение индекса кажется действительным?

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

1. первая итерация должна быть products[0] = (num_list[(4 - 2 - 0)]) * 2

2. Список python — это не то же самое, что массив C. Пространство не выделено. Вам нужно добавить в список. После создания записей вы можете назначить их с помощью индекса.

Ответ №1:

Вы не можете ничего назначить пустому списку по индексу. Возможно, вы хотите products.append((num_list[(num_length - 2 - i)]) * 2) вместо этого.

Ответ №2:

При инициализации продуктов вы инициализируете его как пустой список. Поскольку вы никогда не добавляете какие-либо элементы в список, когда переходите к установке j-го элемента products , вы ссылаетесь на индекс, который не существует. Следующий код показывает простой способ генерации такой ошибки индекса.

 p = []
p[0]
#IndexError: list index out of range
 

Если вы хотите добавить элемент в конец products, вы можете сделать это с помощью append .

 products.append((num_list[(num_length - 2 - i)]) * 2)
 

Однако, если вы хотите установить j-й элемент products, вам нужно будет убедиться, что products содержит не менее j элементов. Если вы знаете максимальное количество индексов, которые вам понадобятся в продуктах в начале, вы можете сгенерировать пустой список с помощью следующего кода.

 products = [None] * max_index   1
 

Ответ №3:

Как указывают другие ответы, в Python недопустимо присваивать по индексу пустому списку таким образом. В любом случае, вы можете подойти к этой проблеме совершенно по-другому в Python. Похоже, что вы выполняете итерацию в обратном num_list направлении, начиная со предпоследнего числа и пропуская все остальные числа, и следующее, вероятно, будет делать то, что вы хотите, гораздо более лаконично, не беспокоясь об индексах:

 def checksum(num_list):
    return [n * 2 for n in num_list[-2::-2]]

>>> checksum([1,2,3,4]) # returns [6, 2]
>>> checksum([1,2,3,4,5]) # returns [8, 4]