在Python中,使列表元素唯一的最快方法是什么?

23

在 Python 中,最快的去重方法是什么?不需要保留顺序。我在网上看到了许多复杂的解决方案 - 它们是否比以下简单方法更快:

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

8
为什么不对它们进行基准测试,找出答案呢? - Chris Lutz
10
如果你需要独特的元素,为什么要费力地将它们从集合中转换回来呢? - Mike DeSimone
2Chris: 所以基准测试已经完成了... 2Mike: 因为列表 -> 列表 - Vojta Rylko
3个回答

26

去重仅适用于所有项都是可哈希的列表,例如在您的示例中如果c = [],则您提供的代码将引发异常。对于不可哈希但可比较的项目,排序列表,然后使用itertools.groupby从中提取唯一项是最佳选择(O(N log N))。如果项目既不全是可哈希的,也不全是可比较的,则您的"最后一招"解决方案只能是O (N squared)

您可以编写一个函数来“去重”任何列表,并使用最佳可用方法尝试每个方法,第一个和第二个方法需要在其周围使用try/except(并在try子句结束时返回结果或者更优雅地,在try语句的else子句中返回结果;-)。


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

如果可能的话,请将其保留在那种形式下。


3
如果不需要保持顺序,你可以遍历集合并测试成员资格,所以不必将其转换回列表。 - Chris Lutz
4
值得注意的是,这假定列表中的所有元素都是可哈希的(请参见Python词汇表)。 - Rodrigue
如果原始列表中元素的顺序很重要(虽然问题中说它不重要,但对某些读者可能很重要),这可能会破坏该顺序。pylang的答案提供了一个保持顺序的选项。 - Alex Hall

6

这篇由Peter Bengtsson 更新的文章 提供了两种在Python 3.6+中制作唯一项目列表的最快方法:

# Unordered (hashable items)
list(set(seq))

# Order preserving
list(dict.fromkeys(seq))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接