以下函数删除列表中的重复元素。我对列表进行排序,然后遍历。如果任何值等于它后面的值,则删除该值。
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 最终将到达列表中的最后一个元素,并且没有超出最后一个元素的元素(即 [i+1] 不存在),所以我得到一个索引错误。
应该通过比通常的完整迭代少一次迭代的时间来纠正这个错误,以说明我们比 i 提前 1 的事实。
为了得到正确的输出,我认为我应该这样写
range(len(myList)-2)
因为-1是最后一个值,-2是之前的值。
事实上,这个函数只有在我写的时候才能正常工作
range(leng(myList)-3)
为什么会这样?看来 -3 应该是太多了?当然 -2 应该足以解释 [i+1]?
请您参考如下方法:
失败是因为您在迭代列表的同时删除元素,因此列表的长度发生变化,索引困惑 - 有效索引将会减少.顺便说一下,一个更惯用的删除重复项的解决方案(只要您不关心元素的顺序)是:
return list(set(myList))
上面使用了 set() 根据定义 消除重复项的事实,所以如果我们从输入列表构建一个集合,然后从该集合构建一个列表,我们将有一个无重复列表 - 尽管元素的顺序可能不同,因为集合不能保证它们的元素保持相同的插入顺序。
