如果你可以散列你的变量(而且,呃,你的变量有一个有意义的__hash__),使用一个集合。
def check_all_unique(li):
unique = set()
for i in li:
if i in unique: return False #hey I've seen you before...
unique.add(i)
return True #nope, saw no one twice.
O(n) 最坏情况。 (是的,我知道您也可以len(li) == len(set(li)),但如果找到匹配项,此变体会提前返回)
如果您不能散列您的值(无论出于何种原因)但可以有意义地比较它们:
def check_all_unique(li):
li.sort()
for i in range(1,len(li)):
if li[i-1] == li[i]: return False
return True
O(nlogn),因为排序。基本上,对所有内容进行排序,然后成对比较。如果两件事相等,则它们应该彼此相邻排序。 (如果由于某种原因,您的__cmp__ 没有对彼此相邻的相同事物进行排序,1. wut 和 2. 请继续下一个方法。)
如果ne 是您拥有的唯一运算符....
import operator
import itertools
li = #a list containing all the variables I must check
if all(operator.ne(*i) for i in itertools.combinations(li,2)):
#do something
我基本上是使用itertools.combinations 来配对所有变量,然后使用operator.ne 来检查是否不相等。这具有 O(n^2) 的最坏情况时间复杂度,尽管它仍然应该短路(因为生成器和 all 是惰性的)。如果你完全确定ne 和eq 是相反的,你可以使用operator.eq 和any 来代替。
附录:Vincent 写了一个更多更易读的itertools 变体版本,看起来像
import itertools
lst = #a list containing all the variables I must check
if all(a!=b for a,b in itertools.combinations(lst,2)):
#do something
附录 2:呃,对于足够大的数据集,排序变体可能应该使用heapq。仍然是 O(nlogn) 最坏的情况,但 O(n) 最好的情况。应该是这样的
import heapq
def check_all_unique(li):
heapq.heapify(li) #O(n), compared to sorting's O(nlogn)
prev = heapq.heappop(li)
for _ in range(len(li)): #O(n)
current = heapq.heappop(li) #O(logn)
if current == prev: return False
prev = current
return True