以下函数删除列表中的重复元素。我对列表进行排序,然后迭代。如果任何值等于它之后的值,则删除该值。
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]?
答案 0 :(得分:7)
它失败了,因为你在迭代它的同时从列表中删除元素,所以列表的长度发生了变化,搞乱了索引 - 将会有更少的有效索引。顺便说一下,删除重复项的更惯用的解决方案(只要你不关心元素的顺序)将是:
return list(set(myList))
以上使用set()
按定义消除重复的事实,因此如果我们从输入列表构建一个集合,然后从集合中创建一个列表,我们将有一个无重复列表 - 尽管元素可能的顺序不同,因为集合不保证它们的元素保持相同的插入顺序。
答案 1 :(得分:4)
您无需从头开始编写此类重复数据删除代码。只需使用内置的set()
:
def remove_duplicates(myList):
return list(set(myList))