删除索引满足条件的每个元素;列表分配索引超出范围
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除索引满足条件的每个元素;列表分配索引超出范围相关的知识,希望对你有一定的参考价值。
我正在做一个练习,其中函数采用列表和整数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
似乎无法超出范围?是什么导致这种情况发生?
答案
你使用什么数据集?根据数据集中的数字,问题是您要从列表中删除对象,当您在该列表中请求特定索引时会产生冲突。
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
另一答案
发生的事情是,当您从列表中删除元素时,列表大小会发生变化。
您不必遍历列表以查找可被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
,所以现在你无法跟踪你想删除列表的原始元素。
以上是关于删除索引满足条件的每个元素;列表分配索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI - 致命错误:从数组中删除元素时索引超出范围