在Python中快速去重列表的方法

23 投票
3 回答
14956 浏览
提问于 2025-04-15 20:54

在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 平方) 的方法。

你可以写一个函数来“去重”任何列表,使用最好的方法,按照顺序尝试每种方法。可以在前两种方法周围加上 tryexcept,然后在 try 语句的最后或者优雅地在 tryelse 部分返回结果;-)。

25
set([a, b, c, a])

如果可能的话,就保持这个形式。

撰写回答