我正在进行一项练习,其中函数采用列表和整数n
,并在其索引i
满足(i+1)%n==0
时删除每个元素。以下是我提出的建议:
def f(lst, n):
for i in range(len(lst)):
if (i+1)%n==0:
del lst[i]
然而,它给了我这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pop.py", line 4, in f
del lst[i]
IndexError: list assignment index out of range
索引指针i
似乎无法超出范围?是什么导致这种情况发生?
答案 0 :(得分:2)
您使用的数据集是什么? 根据数据集中的数字,问题是您要从列表中删除对象,当您在该列表中请求特定索引时会产生冲突。
ex_list = [2, 5, 12]
print range(len(ex_list))
output [0, 1, 2]
因此,假设第一项未通过测试并被删除。现在oyur列表看起来像这样:
ex_list
>>>[5, 12]
问题是你的for循环中的下一个i将是1但现在是:
ex_list[1]
>>>12
最终:
ex_list[2]
>>>IndexError: list assignment index out of range
答案 1 :(得分:1)
当您从列表中删除元素时,您的列表大小正在发生变化。
您不必遍历列表以查找可被n整除的索引 例如如果list_length = 8且n = 2,那么我们知道必须删除元素#[2,4,6,8] = index [1,3,5,7]。你可以在这里创建一个过滤器,或列出这样的理解 -
new_list = [old_list[i] for i in range(len(old_list_length)) if (i+1) % n == 0]
old_list = new_list
注意: - 您可以注意迭代一个已删除元素的列表,因为您要删除的原始元素现在将具有不同的索引。在答案开头的例子中: -
假设您已删除element#2(index = 1)
,现在后续element#4,#8
将变为element #3, #7
,因此您现在无法跟踪要删除列表的原始元素。