Python 理解heapq推送pop
我的目标是根据前十名的值对词典进行排序。使用堆似乎是合适的。所以我读了pythons的heapq并写了这样一篇文章: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
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捕捉得好,我更新了它。现在我看到它,我的直觉是,因为我切掉了最上面的元素,可能堆没有。。。重新调整整个值集。