物事を辞書に入れるためのハッシュ可能な識別子があります:
class identifier():
def __init__(self, d):
self.my_dict = d
self.my_frozenset = frozenset(d.items())
def __getitem__(self, item):
return self.my_dict[item]
def __hash__(self):
return hash(self.my_frozenset)
def __eq__(self, rhs):
return self.my_frozenset == rhs.my_frozenset
def __ne__(self, rhs):
return not self == rhs
ハッシュと等価のために識別子をカプセル化するノードタイプがあります。
class node:
def __init__(self, id, value):
# id is of type identifier
self.id = id
self.value = value
# define other data here...
def __hash__(self):
return hash(self.id)
def __eq__(self, rhs):
if isinstance(rhs, node):
return self.id == rhs.id
### for the case when rhs is an identifier; this allows dictionary
### node lookup of a key without wrapping it in a node
return self.id == rhs
def __ne__(self, rhs):
return not self == rhs
いくつかのノードを辞書に入れました。
d = {}
n1 = node(identifier({'name':'Bob'}), value=1)
n2 = node(identifier({'name':'Alex'}), value=2)
n3 = node(identifier({'name':'Alex', 'nationality':'Japanese'}), value=3)
d[n1] = 'Node 1'
d[n2] = 'Node 2'
d[n3] = 'Node 3'
しばらくして、識別子しかありません。
my_id = identifier({'name':'Alex'})
この識別子でこの辞書に格納されているノードを効率的に検索する方法はありますか?
これは思ったより少し難しいことに注意してください。d[my_id]
関連する item を簡単に取得できることはわかっています'Node 2'
が、への参照を効率的に返したいと考えていますn2
。
のすべての要素を調べることでできることはわかっていますがd
、試してみましたが、遅すぎます(辞書には何千もの項目があり、これをかなりの回数行います)。
内部でその識別子のand演算子をdict
使用して、ノードとそれに関連するアイテムを格納していることを知っています。実際、ルックアップを使用すると、実際には中間ステップとしてルックアップする必要があるため、これは間違いなく可能です。hash
eq
n2
'Node 2'
my_id
'Node 2'
n2
これを使用して、データをグラフに保存しています。value
ノードには、ハッシュで使用されていない多くの追加データ (私が配置した場所) があります。使用しているグラフ パッケージ (networkX) は作成していませんが、ノードを格納するディクショナリを確認できます。ノードへの識別子の周りに追加の辞書を保持することもできますが、これは面倒です (グラフ クラスをラップし、ノードの追加、ノードの削除、リストからのノードの追加、リストからのノードの削除、エッジの追加をすべて書き直す必要があります)。など、その辞書を最新の状態に保つ関数を入力します)。
これはかなりのパズルです。どんな助けでも本当に感謝します!