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

问题描述 投票:-1回答:2

我正在做一个练习,其中函数采用列表和整数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似乎无法超出范围?是什么导致这种情况发生?

python iteration
2个回答
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
投票

发生的事情是,当您从列表中删除元素时,列表大小会发生变化。

您不必遍历列表以查找可被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,所以现在你无法跟踪你想删除列表的原始元素。

© www.soinside.com 2019 - 2024. All rights reserved.