在Python中删除列表中的重复项

1 投票
8 回答
1877 浏览
提问于 2025-04-16 21:28

可能的重复问题:
如何在Python中删除列表中的重复项,同时保持顺序?
在Python中,删除列表中的重复项以确保所有元素唯一的最快方法是什么,同时保持顺序?

我在想是否有一个函数可以做到以下几点:

接收一个列表作为参数:

list = [ 3 , 5 , 6 , 4 , 6 , 2 , 7 , 6 , 5 , 3 ]

然后删除列表中的所有重复项,得到:

list = [ 3 , 5 , 6 , 4 , 2 , 7 ]

我知道可以把它转换成字典,因为字典里不能有重复项,但我在想是否有更好的方法来实现这个功能。

谢谢

8 个回答

2

list(set(l)) 这个写法会打乱原来的顺序。如果你想保持顺序,可以这样做:

s = set()
result = []
for item in l:
    if item not in s:
        s.add(item)
        result.append(item)

print result

这样做的时间复杂度是 O(n),其中 n 是原始列表的长度。

5

虽然你说你不一定想用一个 dict,但我觉得用 OrderedDict 是个很好的解决办法。

from collections import OrderedDict

l = [3 ,5 ,6 ,4 ,6 ,2 ,7 ,6 ,5 ,3]
OrderedDict.fromkeys(l).keys()
# [3, 5, 6, 4, 2, 7]

要注意,这样做可以保持原来的顺序。

7

请查看Python文档,里面有三种方法可以实现这个功能。以下内容是从那个网站复制过来的。把示例中的'mylist'替换成你的变量名('list')。

第一个例子:如果你不介意改变列表的顺序,可以先对列表进行排序,然后从列表的末尾开始扫描,边走边删除重复的元素:

if mylist:
    mylist.sort()
    last = mylist[-1]
    for i in range(len(mylist)-2, -1, -1):
        if last == mylist[i]:
            del mylist[i]
        else:
            last = mylist[i]

第二个例子:如果列表中的所有元素都可以用作字典的键(也就是说,它们都是可哈希的),这种方法通常会更快:

d = {}
for x in mylist:
    d[x] = 1
mylist = list(d.keys())

第三个例子:在Python 2.5及以后的版本中:

mylist = list(set(mylist))

撰写回答