检查List是否是python中的数学集的最快\最pythonic方法是什么?
我知道以下工作:
ListInstance = [1,2,3,4,5,6]
ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )
是否有更好/更快的方法来检查这个?
答案 0 :(得分:2)
它通常不会更快,但如果值不可清除但它们具有可比性,特别是如果它们已经排序,您可以懒洋洋地确定是否有任何元素是非唯一的:
def is_unique(items, key=None):
for k, g in itertools.groupby(sorted(items, key=key), key=key):
if len(list(itertools.islice(g, 2))) > 1:
return False
return True
一旦检测到第一个副本,这将立即停止,并且检查不超过必要的时间,可能运行得更快(特别是在“已经排序的输入”情况下)。通过迭代,可以使用set
进行类似的早期外部方法,以便在快速违反唯一性的情况下最小化散列和存储的元素数量(通过执行此操作)(改编自unique_everseen
itertools
)中的食谱:
def is_unique(iterable):
seen = set()
seen_add = seen.add
for element in iterable:
if element in seen:
return False
seen_add(element)
return True
注意:在少数可输入输入的典型情况下,上述两种解决方案都不是更好,其中唯一性是常见的(或者至少在输入集的早期没有被违反)。您提供的简单解决方案简洁明了,并且在CPython中的C层执行大部分工作,因此与执行大量Python代码的方法相比,它具有更低的固定开销。但是它们可能对于大输入,已经排序的输入和/或唯一性不常见的输入很有用(因此早期行为可以为您节省一些工作)。