基于元组中的第一个值,使用Python的heapq.nlargest()检索值

时间:2016-12-05 23:39:04

标签: python priority-queue

最终,我想要的是根据他们的分数返回前十名'项目'的列表。我正在尝试使用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)对堆进行排序。有没有一种简单的方法来实现这个基于我在这里的结构?

感谢。

1 个答案:

答案 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