检查列表中所有元素是否唯一

147 投票
18 回答
152903 浏览
提问于 2025-04-16 13:32

检查一个列表中的所有元素是否都是唯一的,最好的方法是什么?这里的“最好”是指常见的做法。

我现在使用的方式是用一个叫 Counter 的工具:

>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
        if values > 1: 
            # do something

我能找到更好的方法吗?

18 个回答

21

一种早期退出的解决方案可以是

def unique_values(g):
    s = set()
    for x in g:
        if x in s: return False
        s.add(x)
    return True

不过对于小情况,或者如果早期退出不是常见的情况,我认为使用 len(x) != len(set(x)) 会是最快的方法。

120

这里有一段两行的代码,它也能实现提前退出的功能:

>>> def allUnique(x):
...     seen = set()
...     return not any(i in seen or seen.add(i) for i in x)
...
>>> allUnique("ABCDEF")
True
>>> allUnique("ABACDEF")
False

如果x中的元素不能被哈希(也就是不能唯一标识),那么你就得用列表来代替seen

>>> def allUnique(x):
...     seen = list()
...     return not any(i in seen or seen.append(i) for i in x)
...
>>> allUnique([list("ABC"), list("DEF")])
True
>>> allUnique([list("ABC"), list("DEF"), list("ABC")])
False
227

这个方法可能不是最有效率的,但很简单明了,写得也很简洁:

if len(x) > len(set(x)):
   pass # do something

对于短列表来说,可能效果不会太明显。

撰写回答