在Python中快速去重列表的方法
在Python中,有没有快速的方法可以去掉列表中的重复项,而不需要保持原来的顺序?我在网上看到很多复杂的解决方案——它们真的能比下面这个简单的方法更快吗:
list(set([a,b,c,a]))
3 个回答
6
这篇由彼得·本特森(Peter Bengtsson)更新的文章提到,在Python 3.6及以上版本中,有两种最快的方法可以创建一个只包含独特元素的列表:
# Unordered (hashable items)
list(set(seq))
# Order preserving
list(dict.fromkeys(seq))
26
把一个列表变成集合(set)只有在列表里的所有项目都是可以“哈希”的情况下才有效。比如在你的例子中,如果 c = []
,那么你给出的代码就会出错。对于那些不能哈希,但可以比较的项目,最好的办法是先对列表进行排序,然后用 itertools.groupby
来提取唯一的项目,这样的效率是 O(N log N)。如果项目既不能哈希,也不能比较,那么你唯一的“最后手段”就是用 O(N 平方) 的方法。
你可以写一个函数来“去重”任何列表,使用最好的方法,按照顺序尝试每种方法。可以在前两种方法周围加上 try
和 except
,然后在 try
语句的最后或者优雅地在 try
的 else
部分返回结果;-)。
25
set([a, b, c, a])
如果可能的话,就保持这个形式。