我的目标是按前十名的值对字典进行排序。使用堆似乎是合适的。所以我读了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]
注意到我的错误。那我的原始代码出了什么问题?
答案 0 :(得分:3)
堆中的前10个条目并不总是包含10个最低密钥。要获得最低10,你必须从(整个)堆中弹出10次。
(如果N个第一个条目总是包含N个最低值,那么你将拥有一个排序列表,而不是一个堆!)
通常,不要使用除heapq函数之外的任何内容修改表示堆的列表。