从python列表中删除重复项

从python列表中删除重复项,python,list,Python,List,我正试图编写一个程序来删除列表中的重复项,但我的程序在第5行不断抛出错误“列表索引超出范围”,如果n/(序列[k])==1:。我想不出来。我认为“k”的可能值是0、1和2对吗?如何将其中任何一个作为索引的“序列”排除在可能的索引范围之外 def remove_duplicates(sequence): new_list = sequence for n in sequence: for k in range(len(sequence)):

我正试图编写一个程序来删除列表中的重复项,但我的程序在第5行不断抛出错误“列表索引超出范围”,如果n/(序列[k])==1:。我想不出来。我认为“k”的可能值是0、1和2对吗?如何将其中任何一个作为索引的“序列”排除在可能的索引范围之外

def remove_duplicates(sequence):
    new_list = sequence
    for n in sequence:
        for k in range(len(sequence)):
            if n/(sequence[k]) == 1:
                new_list.remove(sequence[k])
    print new_list

remove_duplicates([1,2,3])

您的错误是同时修改列表:

for k in range(len(sequence)):
    if n/(sequence[k]) == 1:
        new_list.remove(sequence[k])
从新列表中删除似乎不应影响序列,但您在函数开始时执行了
new\u list=sequence
。这意味着新列表实际上是序列,也许你的意思是复制列表

如果您接受它们是相同的列表,那么错误是显而易见的。删除项时,长度和索引都会更改

另外,正如@Akavall在评论中提到的,您所需要的只是:

sequence=list(set(sequence))
使序列不包含重复项。如果需要保留顺序,另一个选项是:

from collections import OrderedDict
sequence=list(OrderedDict.fromkeys(sequence))

如果您不喜欢
列表(设置(您的列表))
因为它不能保证保留顺序,您可以抓取并执行以下操作:

from ordered_set import OrderedSet

foo = list("face a dead cabbage")
print foo
print list(set(foo)) # Order might change
print list(OrderedSet(foo)) # Order preserved

我强烈建议阿卡瓦尔回答:

list(set(your_list))
至于为什么会出现超出范围的错误:Python通过引用传递,也就是说,序列和新列表仍然指向相同的内存位置。更改新列表也会更改顺序

最后,将项目与其自身进行比较,然后删除它们。所以基本上,即使你使用了序列的副本,比如:

new_list = list(sequence)


它将返回一个空列表。

为什么不干脆
列表(设置(您的列表))
?重复的哦,谢谢。但我还是不明白。我不是在修改“新列表”而不是“序列”吗?@Crytera抱歉,这只是个例子,如果你想接受答案,我现在已经修复了它。谢谢你的建议,但我想知道如果我不修改“序列”,为什么会抛出错误。@Crytera解释了你的问题
new_list = list(sequence)
new_list = sequence[:]