检查列表中所有元素是否唯一
检查一个列表中的所有元素是否都是唯一的,最好的方法是什么?这里的“最好”是指常见的做法。
我现在使用的方式是用一个叫 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
对于短列表来说,可能效果不会太明显。