2017-02-24 11 views
-3

私は複雑なデータ構造を持っています。これは基本的にキーがハッシュされたインスタンスです。キーに等しいハッシュ値しかわからない場合は、どうすればインスタンスを取り戻すことができますか?私はブルートフォースでそれを行うことができますが、私はキー/インスタンスをO(1)時間に取得できるはずです。インスタンスである辞書キーを取得する

class Test: 
     def __init__(self, foo, bar): 
       self.foo = foo 
       self.bar = bar 
       self.arr = ["extra"] 
     def __str__(self): 
       return self.foo + self.bar 
     def __hash__(self): 
       return hash(str(self)) 
     def __eq__(self, other): 
       return hash(self) == hash(other) 

my_thing = Test("FOO", "BAR") 

my_dict = dict() 
my_dict[my_thing] = 1 

for k, v in my_dict.iteritems(): 
     if k == "FOOBAR": 
       print k.arr 

編集:私は(この場合は配列)をインスタンス内の可変データを取得することができるようにしたいです。だから私が"FOOBAR"のハッシュを知っていれば、私は["extra"]を得ることができるようにしたいと思っています。

+2

'デフ__eq __(自己、他): リターンハッシュ(自己)==悪いハッシュ(その他)':どのようなハッシュ衝突はどうですか? –

+3

あなたは 'my_thing'をもう一度入手したいですか? –

+4

私はあなたが達成しようとしていることを理解するのに苦労しています。 –

答えて

0

dictはキー(foo、バー)を検索するデータに追加します。私のような衝突を避けるために、あなたのキーの機能を変更

class Test(object): 
    ... 
    def key(self): 
     return (self.foo, self.bar) 

my_thing = Test("FOO", "BAR") 
my_dict = {} 
my_dict[my_thing.key()] = my_thing 

print my_dict[("FOO", "BAR")].arr 

注:ここでは、これを実装できる一つの方法がある

Test("FOO", "BAR") == Test("FOOB", "AR") 
0

ですね、あなたが文字列「FOOBAR」を持っているように(例えば)とあなたの辞書にあるkのキーを取得したいとします。str(k) == "FOOBAR"です。これを行うには

一つの方法は、ちょうど同じ文字列表現を持っているし、あなたのルックアップのためにそれを使用する新しいテストオブジェクト再構築することである。

my_thing = my_dict(Test("FOO", "BAR")) 

をしかし、これは非効率的であるとオブジェクトの作成との間の依存関係を作成しますあなたの文字列表現。

この文字列表現をキーとして、独自の本質的な価値を持っている場合、あなたは自分のdict(または別の辞書)を維持することができる代わりに、文字列をキー:

my_index = dict() 
my_index[str(my_thing)] = my_thing 

そのように、あなたは、与えられた自分の値を検索することができます専用の文字列:

print my_index["FOOBAR"].arr 
関連する問題