В python как вы можете получить ключ из словаря?

У меня есть хешируемый идентификатор для помещения вещей в словарь:

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] для получения связанного элемента 'Узел 2' , но я хочу эффективно вернуть ссылку на n2 .

Я знаю, что могу сделать это, просмотрев каждый элемент в d , но я пробовал это и он слишком медленный (в словаре есть тысячи элементов, и я делаю это довольно много раз).

Я знаю, что внутри dict используется хэш и eq операторы для этого идентификатора, чтобы сохранить узел n2 и связанный с ним элемент, «Узел 2» . Фактически, использование my_id для поиска «Узел 2» действительно требует поиска n2 в качестве промежуточного шага, поэтому это определенно должно быть возможным.

Я использую это для хранения данных в виде графика. Узлы имеют много дополнительных данных (где я поместил значение ), которые не используются в хэше. Я не создавал пакет графа, который использую (networkX), но я могу видеть словарь, в котором хранятся мои узлы. Я мог бы также сохранить дополнительный словарь для идентификаторов узлов, но это было бы болью (мне нужно было бы обернуть класс графа и переписать все добавить узел, удалить узел, добавить узлы из списка, удалить узлы из списка, добавить край и т. д., чтобы поддерживать этот словарь в актуальном состоянии)

Это большая загадка. Любая помощь будет очень признательна!

5
задан lifebalance 18 January 2014 в 19:05
поделиться