在Python中删除列表中的重复项
可能的重复问题:
如何在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))