Python 快速检查列表是否为数学集
Python Check If List Is a Mathematical Set Fast
检查列表是否是 python 中的数学集的最快\最 pythonic 方法是什么?
我知道以下作品:
ListInstance = [1,2,3,4,5,6]
ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )
有没有better/faster方法来检查这个?
它通常不会更快,但如果值不可散列但它们是可比较的,特别是如果它们已经排序,您可以延迟确定是否有任何元素是非唯一的:
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
这将在检测到第一个重复项后立即停止,并且检查的次数不超过必要,这 可能 运行 更快(特别是在 "input already sorted"案件)。可以使用 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
注意:在少数可散列输入的典型情况下,上述解决方案都不是更好的情况,其中唯一性是常见的(或者至少,在输入集的早期没有被违反)。你给出的simple solution简洁明了,在CPython中完成了C层的大部分工作,所以相对于执行大量Python代码的方法,它的固定开销要低得多.但是它们 可能 对大输入有用,已经排序的输入, and/or 唯一性不常见的输入(因此提前输出行为可以节省一些工作)。
检查列表是否是 python 中的数学集的最快\最 pythonic 方法是什么?
我知道以下作品:
ListInstance = [1,2,3,4,5,6]
ListIsMathSet = (len(set(ListInstance)) == len(ListInstance) )
有没有better/faster方法来检查这个?
它通常不会更快,但如果值不可散列但它们是可比较的,特别是如果它们已经排序,您可以延迟确定是否有任何元素是非唯一的:
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
这将在检测到第一个重复项后立即停止,并且检查的次数不超过必要,这 可能 运行 更快(特别是在 "input already sorted"案件)。可以使用 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
注意:在少数可散列输入的典型情况下,上述解决方案都不是更好的情况,其中唯一性是常见的(或者至少,在输入集的早期没有被违反)。你给出的simple solution简洁明了,在CPython中完成了C层的大部分工作,所以相对于执行大量Python代码的方法,它的固定开销要低得多.但是它们 可能 对大输入有用,已经排序的输入, and/or 唯一性不常见的输入(因此提前输出行为可以节省一些工作)。