我希望遍历ID列表,并返回出现多次的ID列表。这是我设置的有效的方法:
singles = list(ids)
duplicates = []
while len(singles) > 0:
elem = singles.pop()
if elem in singles:
duplicates.append(elem)
但是id列表可能会变得很长,而且我实际上不希望在昂贵的len调用基础上进行while循环,如果可以避免的话。(我可以走一条优雅的路线,然后打电话给len,然后在每次迭代时递减它,但如果可以的话,我宁愿避免这样做)。
做到这一点的明智方法是使用使数据结构变得简单高效的数据结构,例如Counter
:
>>> ids = [random.randrange(100) for _ in range(200)]
>>> from collections import Counter
>>> counts = Counter(ids)
>>> dupids = [id for id in ids if counts[id] > 1]
与Counter
花费O(N log N)进行排序,或花费O(N ^ 2)来从头开始计算每个元素相比,构建花费O(N)时间。
附带说明:
但是id列表可能会变得很长,而且我实际上不希望在昂贵的len调用基础上进行while循环,如果可以避免的话。
len
不贵。这是恒定的时间,并且(至少在内置类型列表上list
),它几乎只要不执行任何操作就可以在Python中获得功能。
代码中昂贵的部分是elem in singles
在循环内调用-这意味着对于每个元素,您都必须将其与可能的每个其他元素进行比较,这意味着二次时间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句