2012-02-09 80 views
6

我想在python中實現一個哈希表。在表上,一個類對象將與鍵值相關聯。問題是我想使用鍵值來查找類的索引並更新它(這當然不是問題)。但是,如果我想使用該類的特定值對錶格進行排序,我該怎麼辦?Python哈希表設計

例如,讓我們考慮,我們有三個值:DOCUMENT_ID,得分和排名。有一個由「score」和「rank」組成的「文件」類。 「document_id」將成爲表格的關鍵。

我想更新表的各個條目的「分數」,使用鍵:「DOCUMENT_ID」。但是,當更新分數完成後,我想使用分數對列表/表格進行排序,並根據更新的分數將排名值分配給「排名」變量。

可有人請給我說說我怎麼能進行一些指導?或者,也許我應該簡單地把它列入清單?

表中的項目的最大數量也可能高達25000-30000。

謝謝。

回答

21

Python的字典已經是一個哈希表。

doc_hash = {} 
doc_hash[doc.id] = doc 

要指定等級:

docs = sorted(doc_hash.itervalues(), key=operator.attrgetter('score'), reverse=True) 
for i, doc in enumerate(docs): 
    doc.rank = i 
+0

感謝您的答覆。但是,如果我每次更新/插入文檔時嘗試更新排名,那麼循環順序不會迅速增加,而不是在所有插入/更新結束時排序?我不會在隊伍中做更多的事情。整理出來之後,我會把它們放在一個文件中。 – 2012-02-09 14:32:49

+0

我不知道你的意思是「迅速增加」?您可以添加一堆文檔,然後在最後重新分配排名。我錯誤地說「每次插入一個」。 – 2012-02-09 14:39:30

+0

對不起,如果是在添加文檔的末尾,那就沒關係。我在談論桌子的大小。我想如果我每次輸入/更新一個巨大的表中的條目時嘗試運行一些排序,那麼它可能會變成一個漫長的過程。 – 2012-02-09 14:45:05

0

像這樣的事情?

sorted_keys = sorted(d.keys(), key=lambda element: element['score']) 
for i in range(len(sorted_keys)): 
    d[sorted_keys[i]]['rank'] = i 

分配給在d每個元素(元素被隱含爲字典以及)基於其得分的秩。

+9

瞭解'枚舉'。它會讓你開心:) – 2012-02-09 14:31:25

4

爲什麼不使用OrderedDict

>>> from collections import OrderedDict 

>>> # regular unsorted dictionary 
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2} 

>>> # dictionary sorted by key 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0])) 
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)]) 

>>> # dictionary sorted by value 
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1])) 
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]) 

>>> # dictionary sorted by length of the key string 
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0]))) 
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])