2016-04-24 190 views
1

下面的函数删除列表中的重复元素。我对列表进行排序,然后迭代。如果任何值等于后面的值,则删除该值。IndexError:列表索引超出范围。它应该在范围

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]不存在),然后我得到的指数错误。

这个错误应该是通过遍历一个比通常会是一个完整的迭代,考虑到我们是由1

放眼望去我的要得到正确的输出的事实更少的时间来弥补,我相信我应该写

range(len(myList)-2) 

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

事实上,该功能只按预期工作,如果我写

range(leng(myList)-3) 

为什么会出现这种情况?看起来-3应该是一个太多?当然-2应该足以说明[i + 1]?

回答

7

这是因为你从列表中删除元素的同时,你正在迭代,所以列表的长度改变,与索引搞乱 - 会有更少的有效索引失败。顺便说一句,去除重复一个更地道的解决方案(只要你不关心元素的顺序排列)是:

return list(set(myList)) 

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

+0

这是真的,我从来没有想到这一点。这完全解释了为什么我需要弥补一个额外的1.谢谢。我会在10分钟内让我接受这个答案。 – PencilCrate

+1

没问题,谢谢! –

4

您不需要从头开始编写这样的重复数据删除代码。只要使用内置的set()

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