Python - 有没有"rank list"或者我应该实现一个



我想使用一个数据结构,该数据结构使我可以在最佳运行时存储最多的x对象,并在最佳的运行时间内管理该结构。

我们称其为 Rank_List()。让我们定义X = 2,以下情况应发生。

ranked_list = Rank_List()
ranked_list.add((obj1, 0.5)
print ranked_list -> [(obj1, 0.5)]
ranked_list.add((obj2, 0.75))
print ranked_list -> [(obj2, 0.75), (obj1, 0.5)]

因此,我们可以看到它可以保持排名(首先为0.75,而0.5在第二位)

ranked_list.add(obj3, 0.7)
print ranked_list -> [(obj2, 0.75), (obj3, 0.7)]

添加另一个比OBJ1更高的对象后,OBJ1被排除在列表之外(X = 2因此,只有多达2个对象可以存储在列表中)

是否存在Python中已经存在类似的数据结构?如果没有

从我了解的注释中,您希望从序列中提取顶级k元素。在这种情况下,您根本不需要整理列表。您可以使用堆队列

hapq是一棵二进制树,任何父母的价值要么小于其任何一个孩子(如果您翻转值)。这意味着您总是可以按顺序(k)时间找到顶部的K元素,但是在插入时保持堆仅需O(logn)时间。总体而言,对于n个项目和k个最高项目(按顺序),这为您提供了非常有效的O(Klogn)算法。

Python标准库包括heapq模块为您执行此操作。

您可以自己保留堆,也可以使用heapq.nlargest功能为您的估计构建堆,然后直接返回顶部K项目。

要将k 最大的项目保存在手动保存的堆中,首先构建k元素的列表(如(priority, elem)元组),一旦达到该大小,请使用heapify(),然后从那里开始使用heapreplace()将下一个元素推入列表,然后删除最小的。这样,您总是保留固定尺寸的最大物品。最后,使用sorted(heap, reverse=True)以相反排序的顺序(最大到最小)为您提供那些最大的项目。

最新更新