rec*_*gle 12 python list set python-2.7
我有一个列表,我试图从中删除重复的项目.我正在使用python 2.7.1所以我可以简单地使用set()函数.但是,这会重新排序我的列表.对于我的具体情况,这是不可接受的.
下面是我写的一个函数; 这样做.但是我想知道是否有更好/更快的方式.对此也有任何意见,将不胜感激.
def ordered_set(list_):
newlist = []
lastitem = None
for item in list_:
if item != lastitem:
newlist.append(item)
lastitem = item
return newlist
Run Code Online (Sandbox Code Playgroud)
上面的函数假设没有项目是None,并且项目是有序的(即,''a','a','a','b','b','c','d '])
上面的函数将['a','a','a','b','b','c','d']作为['a','b','c','d'返回].
Zau*_*bov 12
另一个非常快速的方法:
def remove_duplicates(lst):
dset = set()
# relies on the fact that dset.add() always returns None.
return [item for item in lst
if item not in dset and not dset.add(item)]
Run Code Online (Sandbox Code Playgroud)
使用OrderedDict:
from collections import OrderedDict
l = ['a', 'a', 'a', 'b', 'b', 'c', 'd']
d = OrderedDict()
for x in l:
d[x] = True
# prints a b c d
for x in d:
print x,
print
Run Code Online (Sandbox Code Playgroud)
假设输入序列是无序的,这里是O(N)
解决方案(空间和时间).它会生成一个删除了重复项的序列,同时保留与输入序列中出现的相同顺序的唯一项.
>>> def remove_dups_stable(s):
... seen = set()
... for i in s:
... if i not in seen:
... yield i
... seen.add(i)
>>> list(remove_dups_stable(['q', 'w', 'e', 'r', 'q', 'w', 'y', 'u', 'i', 't', 'e', 'p', 't', 'y', 'e']))
['q', 'w', 'e', 'r', 'y', 'u', 'i', 't', 'p']
Run Code Online (Sandbox Code Playgroud)
我知道这已经得到了解答,但是这里有一个单行(加上导入):
from collections import OrderedDict
def dedupe(_list):
return OrderedDict((item,None) for item in _list).keys()
>>> dedupe(['q', 'w', 'e', 'r', 'q', 'w', 'y', 'u', 'i', 't', 'e', 'p', 't', 'y', 'e'])
['q', 'w', 'e', 'r', 'y', 'u', 'i', 't', 'p']
Run Code Online (Sandbox Code Playgroud)