Python检查List是否是数学集快速

时间:2015-10-14 22:26:51

标签: python list set big-o isinstance

检查List是否是python中的数学集的最快\最pythonic方法是什么?

我知道以下工作:

ListInstance = [1,2,3,4,5,6]
ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )

是否有更好/更快的方法来检查这个?

1 个答案:

答案 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代码的方法相比,它具有更低的固定开销。但是它们可能对于大输入,已经排序的输入和/或唯一性不常见的输入很有用(因此早期行为可以为您节省一些工作)。

相关问题