删除索引满足条件的每个元素;列表分配索引超出范围

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 - 致命错误:从数组中删除元素时索引超出范围

计算数组时出现“列表分配索引超出范围”错误

致命错误:索引超出范围,同时在 SwiftUI 的列表中从 Firebase 中删除项目

Python构建二维数组获取列表分配索引超出范围

当我遍历我的列表时,返回列表索引超出范围

是从动态分配的数组中索引的元素超出了有效范围[duplicate]