最终,我想要的是根据他们的分数返回前十名'项目'的列表。我正在尝试使用heapq实现各种优先级队列,到目前为止我得到的是:
class my_queue:
# heap-based priority queue for top items
def __init__(self):
self.top_items = []
def push_item(self, item):
score = item.get_score()
item_name = item.get_name()
heapq.heappush(self.top_items, (score, item_name))
def top_ten(self):
top_ten_items = heapq.nlargest(10, self.top_items, key=lambda s: s[0])
print top_ten_items
我正在使用key=lambda s: s[0]
尝试根据score
中的(score, item_name)
对堆进行排序。有没有一种简单的方法来实现这个基于我在这里的结构?
感谢。
答案 0 :(得分:1)
heapq.nlargest相当于:
sorted(iterable, key=key, reverse=True)[:n]
这意味着调用heapq.nlargest(10, self.top_items)
会再次对所有项目进行排序,您将无法获得heap
数据结构。
heap
中的最小项可以通过heapq.heappop函数调用获得,因为heap
的python实现实际上是min heap
。
要从n
中获取heap
个最大项目,您需要将最大项目设为最小项目,然后再将它们推入heap
(乘以-1)。例如,像这样:
class my_queue:
# heap-based priority queue for top items
def __init__(self):
self.top_items = []
def push_item(self, item):
# minus to make the largest scores the smallest
heapq.heappush(self.top_items, (-item.get_score(), item))
def top_ten(self):
top_ten_items = []
for i in xrange(10):
# minus to revert minus in push_item
large_item = -heapq.heappop(self.top_items)
top_ten_items.append(large_item)
print top_ten_items