如果我知道列表的元素是可以排序的,但我不关心列表中项目的顺序,该如何从列表中删除重复的项目?像如何从Python列表中删除重复项并保留顺序?或在列表中去除重复项这样的现有问题需要使用集合,即要求列表中的项目是可哈希的。但在我的情况下,哈希性不能保证。请注意保持 HTML 标签不变。
在Python中,对已经排序好的列表调用sorted函数几乎没有额外的开销。因此,没有必要增加额外的复杂性和可能会导致某人不小心传递错误参数给函数的可能性。
from itertools import groupby
def remove_duplicates(data):
''' Remove duplicates from the data (normally a list).
The data must be sortable and have an equality operator
'''
data = sorted(data)
return [k for k, v in groupby(data)]
编辑:请参考John La Rooy的答案,那个更好。
再次说明,这个解决方案仅适用于可排序的列表。如果您预先对其进行了排序(实际上只需要将对象进行分组),则可以设置sort=False,然后它只需要比较运算符。
def remove_duplicates(data, sort=True):
''' Remove duplicates from the data (normally a list).
The data must be sortable and have an equality operator
'''
if not data:
return data
if sort:
data = sorted(data)
out = [data[0]]
for i, n in enumerate(data[1:]):
if data[i] != n:
out.append(n)
return out
__hash__
,这样你就可以使用set()
。 - TigerhawkT3from itertools import izip_longest
和out = [x for (x,y) in izip_longest(data,data[1:]) if x != y]
可以获得更快的结果。给定range(1000)*3
,所以所有内容都被复制三次,并且预先排序,运行10,000次迭代,使用你的代码需要约5秒钟,而使用izip_longest只需要3.3秒,结果列表相同。 - TessellatingHecklerdata[1:]
更快。 - John La Rooyzip()
,itertools.zip_longest()
,range()
等已经生成惰性对象而不是急切地创建一个list
。 - TigerhawkT3
list(set(list))
集合需要可哈希元素吗? - Trilarionset([{'a': 2}])
会抛出TypeError: unhashable type: 'dict'
异常。如果我想从一个字典列表中删除重复项,我不能使用那些用户标记的“重复项”。 - vitiral