了解heapq push pop

时间:2013-05-11 21:39:08

标签: 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 = 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]

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

1 个答案:

答案 0 :(得分:3)

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

(如果N个第一个条目总是包含N个最低值,那么你将拥有一个排序列表,而不是一个堆!)

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