2012-02-09 14 views
6

私は、Pythonでハッシュテーブルを実装したいと思います。テーブルでは、クラスオブジェクトがキー値に関連付けられます。問題は、クラスのインデックスを見つけて更新するためにキー値を使用したいということです(問題はありません)。しかし、クラスの特定の値を使用してテーブルを並べ替える場合はどうすればよいですか。Pythonハッシュテーブルの設計

たとえば、document_id、score、およびrankという3つの値があるとします。 「スコア」と「ランク」からなるクラス「文書」があります。 "document_id"がテーブルのキーになります。

キー "document_id"を使用して、テーブルのさまざまなエントリの「スコア」を更新します。しかし、スコアの更新が終わると、スコアを使用してリスト/テーブルをソートし、更新されたスコアに基づいてランク値をランク変数に割り当てたいと思います。

どうすればいいですか?あるいは、単にそれをリストにする必要がありますか?

テーブルの最大項目数は、最大25000-30000です。

ありがとうございました。

答えて

21

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 
+0

返信いただきありがとうございます。しかし、私が文書を更新/挿入するたびにランクを更新しようとすると、挿入/更新の最後にソートするのではなく、ループの順序が急速に増加するのではないでしょうか?私はランクでは何もしません。それらを並べ替えた後、私はそれらをファイルに入れます。 –

+0

「急速に増える」という意味は分かりません。多数のドキュメントを追加し、最後にランクを一度に再割り当てすることができます。私は「あなたが1つを挿入するたびに」についてミスを犯しました。 –

+0

申し訳ありませんが、ドキュメントを追加し終わった時点であれば問題ありません。私はテーブルの大きさについて話していた。巨大なテーブルにエントリを登録/更新するたびに並べ替えを実行しようとすると、時間がかかることがあります。 –

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

'enumerate'について学んでください。それはあなたを幸せにする:) –

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)]) 
関連する問題