2012-02-09 55 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)])