Python检查列表是否是数学集

2024-04-19 20:44:39 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中,检查列表是否为数学集的最快\最具python风格的方法是什么?你知道吗

我知道以下工作:

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

有没有更好/更快的检查方法?你知道吗


Tags: 方法列表len风格数学setlistismathsetlistinstance
1条回答
网友
1楼 · 发布于 2024-04-19 20:44:39

通常不会更快,但如果值不是可散列的,但它们是可比较的,特别是如果它们已经排序,则可以延迟确定是否有任何元素是非唯一的:

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来实现,通过这样做(改编自itertools中的unique_everseen配方),在快速违反唯一性的情况下进行迭代以最小化散列和存储的元素数:

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

相关问题 更多 >