#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]