Python中如何从列表中删除重复项

6
我正在尝试编写一个程序来从列表中删除重复项,但是我的程序在第五行if n/(sequence[k]) == 1:处抛出了" list index out of range "错误。我无法理解这个问题。我的想法是 "k" 的可能值是0、1和2,那么以这些为索引的 "sequence" 如何超出可能的索引范围?
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])

6
为什么不直接使用 list(set(你的列表)) - Akavall
2
去除Python列表中的重复项 - taesu
4个回答

6
我强烈建议采用Akavall的答案:
list(set(your_list))

关于为什么会出现超出范围错误:Python采用按引用传递的方式,也就是说sequence和new_list仍然指向同一个内存位置。修改new_list也会改变sequence。
最后,您正在将项目与自身进行比较,然后将它们删除。所以基本上,即使您使用了sequence的副本,例如:
new_list = list(sequence)

或者

new_list = sequence[:]

它将返回一个空列表。

1
这并不保证剩余元素的顺序相同。 - 9769953

3

你的错误是列表的并发修改:

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

似乎从new_list中删除元素并不会影响顺序,但是你在函数开始处执行了new_list = sequence。这意味着new_list实际上就是sequence,也许你的意思是要复制列表?可以使用new_list=list(sequence)
如果你认为它们是同一个列表,那么错误就很明显了。当你删除元素时,长度和索引都会发生变化。
另外,正如@Akavall在评论中提到的,你只需要:
sequence=list(set(sequence))

为了使序列中不包含重复项。另一个选项是,如果您需要保留顺序,请使用以下方法:
from collections import OrderedDict
sequence=list(OrderedDict.fromkeys(sequence))

哦,谢谢。但我还是不明白。我难道不是在修改“new_list”,而不是“sequence”吗? - Crytera
@Crytera 抱歉,那只是举例子,我现在已经修复了,如果你想接受答案的话。 - Others
谢谢您的建议,但我更想知道为什么会抛出错误,如果我没有修改“sequence”。 - Crytera
@Crytera 解释了你的问题。 - Others

1

如果你不喜欢list(set(your_list)),因为它不能保证顺序,你可以使用有序集合的配方,然后执行以下操作:

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

0
# like @Akavall suggested
def remove_duplicates(sequence):
    # returns unsorted unique list
    return list(set(sequence))

# create a list, if ele from input not in that list, append.
def remove_duplicates(sequence):
    lst = []
    for i in sequence:
        if i not in lst:
            lst.append(i)
    # returns unsorted unique list
    return lst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接