我一直得到IndexError:列表分配索引超出范围。我的逻辑如下:print(x)显示在得到错误之前打印出了6。逻辑地处理代码,6 % 4 == 0为真,因此代码应该删除数字[6 - 1],即数字[5]。之后,x被加到7,循环不再迭代。
谁能指出我错在哪里吗?TIA。# create list from user specifications
numbers = []
size = int(input("Enter the number of elements: "))
for i in range(0, size):
numbers.append(int(input("Enter an element: ")))
# Iterate through each element. If an elements index is a multiple of 3,
# delete it.
x = 1
while x <= size:
print(x)
if ((x) % 3) == 0:
del(numbers[x - 1])
x = x + 1
print("The list is: ")
print(numbers)
问题是数组在循环过程中会改变大小。当索引确实是3的倍数时,del
操作将元素从数组中移除,因此numbers
不再具有size
的大小,但您的索引变量x
仍然会上升到size-1
的值,该值高于您修改的数组的最后一个索引。
一种简单的方法是构建一个列表的副本,而不是从中删除元素,并忽略所有索引倍数为3的元素。
# create list from user specifications
numbers = []
size = int(input("Enter the number of elements: "))
for i in range(0, size):
numbers.append(int(input("Enter an element: ")))
# Iterate through each element. If an elements index is a multiple of 3,
# delete it.
x = 1
filtered = []
while x <= size:
print(x)
if not ((x % 3) == 0):
filtered.append(numbers[x-1])
x = x + 1
numbers = filtered
print("The list is: ")
print(numbers)
当您删除列表中的一个项时,剩余的项将向左移动,从而改变它们的索引。在第一次删除之后,您要么必须更改索引值,要么使用完全不同的技术。Python非常适合过滤带有"理解式"的列表。使用它和enumerate
函数(该函数将发出值及其索引),可以大大简化此操作。
numbers = [1,2,3,4,5,6,7,8,9,10]
numbers = [value for index, value in enumerate(numbers, 1) if index % 3]
print(numbers)