Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python哈希表设计_Python_Hash - Fatal编程技术网

Python哈希表设计

Python哈希表设计,python,hash,Python,Hash,我想用python实现一个哈希表。在表上,类对象将与键值相关联。问题是我想使用键值来查找类的索引并更新它(这当然不是问题)。但是,如果我想使用类的特定值对表进行排序,该怎么办呢 例如,让我们考虑一下,我们有三个值:文档ID、分数和排名。有一个类“文档”,它由“分数”和“等级”组成。“文档id”将是表的键 我想使用键“document_id”更新表中各个条目的“score”。但是,当完成分数更新时,我想使用分数对列表/表进行排序,并根据更新后的分数为“rank”变量分配rank值 有人能给我一些关

我想用python实现一个哈希表。在表上,类对象将与键值相关联。问题是我想使用键值来查找类的索引并更新它(这当然不是问题)。但是,如果我想使用类的特定值对表进行排序,该怎么办呢

例如,让我们考虑一下,我们有三个值:文档ID、分数和排名。有一个类“文档”,它由“分数”和“等级”组成。“文档id”将是表的键

我想使用键“document_id”更新表中各个条目的“score”。但是,当完成分数更新时,我想使用分数对列表/表进行排序,并根据更新后的分数为“rank”变量分配rank值

有人能给我一些关于如何继续的指导吗?或者我应该把它列个清单

表中项目的最大数量可能高达25000-30000


谢谢

Python的dict已经是一个哈希表了

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
像这样的

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

根据分数为
d
中的每个元素分配一个等级。

为什么不使用
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)])

了解
枚举
。这会让你高兴的:)谢谢你的回复。但是,如果我每次更新/插入文档时都尝试更新排名,那么循环的顺序不会快速增加,而不是在所有插入/更新结束时进行排序吗?我不会在队伍里做更多的事情。把它们分类后,我就把它们放进一个文件里。我不知道你说的“快速增长”是什么意思?您可以添加一组文档,然后在最后一次重新分配所有列组。我错说了“每次你插入一个。”很抱歉,如果是在添加文档的末尾,那么就可以了。我说的是桌子的大小。我想,如果每次在一个大表中输入/更新条目时都尝试运行排序,那么这可能会成为一个漫长的过程。@KarlKnechtel,我很抱歉,有一些编辑,因此注释没有足够的意义。在这个问题上我告诉了他。更新条目后,我想根据特定字段对它们进行排序。这就是我所说的。你不能对一个杂烩进行排序。散列不是序列。如果要保持值的排序顺序,请使用适当的数据结构。