2

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

我知道以下作品:

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

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

4

1 回答 1

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

于 2015-10-15T00:11:19.930 回答