IndexError:列表索引超出范围。它应该在范围内

时间:2016-04-24 02:15:19

标签: python

以下函数删除列表中的重复元素。我对列表进行排序,然后迭代。如果任何值等于它之后的值,则删除该值。

def remove_duplicates(myList):
    myList.sort()
    for i in range(len(myList)-2):
        if myList[i] == myList[i+1]:
            del myList[i]
    print(myList)

remove_duplicates([1,1,2,3,4,4,5,6])

由于我最终会到达列表中的最后一个元素,并且最后一个元素之外没有元素(即[i + 1]不存在),所以我得到一个索引错误。

这个错误应该通过迭代比通常完整迭代少一个时间来弥补,以解释我们在i之前看1的事实。

为了得到正确的输出,我相信我应该写

range(len(myList)-2)

因为-1是最后一个值,而-2是之前的值。

事实上,如果我写

,这个功能只能按预期工作
range(leng(myList)-3)

为什么会这样?似乎-3应该是一个太多了?肯定-2应该足以说明[i + 1]?

2 个答案:

答案 0 :(得分:7)

它失败了,因为你在迭代它的同时从列表中删除元素,所以列表的长度发生了变化,搞乱了索引 - 将会有更少的有效索引。顺便说一下,删除重复项的更惯用的解决方案(只要你不关心元素的顺序)将是:

 return list(set(myList))

以上使用set()按定义消除重复的事实,因此如果我们从输入列表构建一个集合,然后从集合中创建一个列表,我们将有一个无重复列表 - 尽管元素可能的顺序不同,因为集合不保证它们的元素保持相同的插入顺序。

答案 1 :(得分:4)

您无需从头开始编写此类重复数据删除代码。只需使用内置的set()

def remove_duplicates(myList):
    return list(set(myList))