2013-05-11 79 views
0

我的目標是按照前十名的值對字典進行排序。使用堆似乎很合適。所以,我對蟒蛇heapq讀了寫了這樣:瞭解heapq push pop

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

你從'top_ten'彈出,但從不在函數中定義它。它的價值是什麼? – 2013-05-11 21:45:33

+0

@MartijnPieters好趕上,我更新它。現在我看到它了,我的直覺是因爲我切掉了頂層元素,也許堆沒有......重新提取整個值。 – 2013-05-11 21:58:49

回答

3

堆中的前10個條目並不總是包含10個最低鍵。爲了得到最低的10個,你必須從整個堆中彈出10次。

(如果N個第一項總是包含N個最低的,你本來就是一個排序列表,而不是一個堆!)

在一般情況下,不修改表示使用任何東西,但你的堆列表heapq函數。