从列表python中删除重复项

时间:2015-03-02 03:35:58

标签: python list

我正在尝试编写一个程序来删除列表中的重复项,但我的程序不断在第5行if n/(sequence[k]) == 1:上抛出错误“list index out of range”。我无法弄清楚这一点。我是否正确地认为“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])

4 个答案:

答案 0 :(得分:3)

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

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

似乎从new_list中删除不应该影响序列,但是你在函数的开头做了new_list = sequence。这意味着new_list实际上字面上是序列,也许你的意思是new_list=list(sequence)来复制列表?

如果您接受它们是相同的列表,则错误很明显。删除项目时,长度和索引会更改。

P.S。正如@Akavall在评论中所提到的,您只需要:

sequence=list(set(sequence))

使序列不包含欺骗。如果您需要保留订购,另一个选择是:

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

答案 1 :(得分:3)

我强烈建议Akavall回答:

list(set(your_list))

至于为何超出范围错误:Python通过引用传递,即序列和new_list仍然指向相同的内存位置。更改new_list也会改变顺序。

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

new_list = list(sequence)

new_list = sequence[:]

它将返回一个空列表。

答案 2 :(得分:1)

如果您不喜欢list(set(your_list)),因为无法保证保留订单,您可以抓住the OrderedSet recipe然后执行:

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

答案 3 :(得分: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