2024-04-19 20:44:39 发布
网友
在python中,检查列表是否为数学集的最快\最具python风格的方法是什么?你知道吗
我知道以下工作:
ListInstance = [1,2,3,4,5,6] ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )
有没有更好/更快的检查方法?你知道吗
通常不会更快,但如果值不是可散列的,但它们是可比较的,特别是如果它们已经排序,则可以延迟确定是否有任何元素是非唯一的:
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配方),在快速违反唯一性的情况下进行迭代以最小化散列和存储的元素数:
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代码的方法相比,它的固定开销要低得多。但是,它们可能对大型输入、已排序的输入和/或唯一性不常见的输入有用(因此提前退出的行为可以为您节省一些工作)。你知道吗
通常不会更快,但如果值不是可散列的,但它们是可比较的,特别是如果它们已经排序,则可以延迟确定是否有任何元素是非唯一的:
一旦检测到第一个重复,这将立即停止,并且检查的次数不超过所需的次数,这可能会运行得更快(特别是在“输入已排序”的情况下)。类似的基于早期输出的方法可以使用
set
来实现,通过这样做(改编自itertools
中的unique_everseen
配方),在快速违反唯一性的情况下进行迭代以最小化散列和存储的元素数:注意:上述两种解决方案在少数可散列输入的典型情况下都不是更好的,其中唯一性是常见的(或者至少在输入集的早期没有违反)。您给出的简单解决方案简洁明了,并且在CPython的C层执行大部分工作,因此与执行大量Python代码的方法相比,它的固定开销要低得多。但是,它们可能对大型输入、已排序的输入和/或唯一性不常见的输入有用(因此提前退出的行为可以为您节省一些工作)。你知道吗
相关问题 更多 >
编程相关推荐