Python 理解heapq推送pop

Python 理解heapq推送pop,python,heap,Python,Heap,我的目标是根据前十名的值对词典进行排序。使用堆似乎是合适的。所以我读了pythons的heapq并写了这样一篇文章: def top_ten_hash_tags(ranked_hash_tags): desc_hash_tags = [] for hash_tag, rank in ranked_hash_tags.items(): heapq.heappush(desc_hash_tags, (rank, hash_tag)) top_ten = des

我的目标是根据前十名的值对词典进行排序。使用堆似乎是合适的。所以我读了pythons的heapq并写了这样一篇文章:

def top_ten_hash_tags(ranked_hash_tags):
    desc_hash_tags = []
    for hash_tag, rank in ranked_hash_tags.items():
        heapq.heappush(desc_hash_tags, (rank, hash_tag))
    top_ten = desc_hash_tags[0:10]
    while top_ten:
        i = heapq.heappop(top_ten)
        rank, hash_tag = i[0], i[1]
        print hash_tag.encode('utf-8'), (rank *-1.0)
它给出了几乎正确的结果,如此接近事实,以至于我没有注意到它是错误的

过了一会儿,我用一些借用的代码对它进行了测试:

sorted_tags = sorted(ranked_hash_tags.iteritems(), key=operator.itemgetter(1), reverse=True)
for i in sorted_tags[0:10]:
    print i[0].encode('utf-8'), i[1]

注意到我的错误。那么,我的原始代码出了什么问题

堆中的前10个条目并不总是包含最低的10个键。要获得最低的10次,您必须从(整个)堆中弹出10次

(如果前N个条目始终包含最低的N个条目,那么您将得到一个排序列表,而不是一个堆!)


通常,不要使用heapq函数以外的任何函数修改表示堆的列表。

堆中的前10个条目并不总是包含最低的10个键。要获得最低的10次,您必须从(整个)堆中弹出10次

(如果前N个条目始终包含最低的N个条目,那么您将得到一个排序列表,而不是一个堆!)


通常,不要使用heapq函数以外的任何函数修改表示堆的列表。

您将从
前十名中弹出,但永远不要在函数中定义它。它的价值是什么?@MartijnPieters捕捉得好,我更新了它。现在我看到它,我的直觉是,因为我切掉了最上面的元素,可能堆没有。。。重新调整整个值集。您将从
前十名中弹出,但从未在函数中定义它。它的价值是什么?@MartijnPieters捕捉得好,我更新了它。现在我看到它,我的直觉是,因为我切掉了最上面的元素,可能堆没有。。。重新调整整个值集。