2013-06-11 3 views
1

Я хожу по структуре данных и хотел бы построить отображение битов X-> Y, где X - это поле в структуре данных, в которую я иду, и Y - поле в структуре данных, на которой я строил летать. X - непереключаемый тип.Есть ли эквивалент Python для Java IdentityHashMap?

+1

Если X не сотрясается, то разумно предположить, что он может измениться (сделать картографирование немного сложнее). Вы хотите, чтобы этот экземпляр «X» всегда указывал на экземпляр «Y»? Или вы хотите, чтобы любой X этого значения указывал на это «Y». Если это первый, тогда вы можете назначить идентификатор каждому X, а затем идентификатор должен быть сопоставлен с «Y». Если это второй, вы можете временно хранить X в хешируемом контейнере, таком как кортеж, и использовать его в качестве ключа. Я уверен, что есть, вероятно, более быстрые способы сделать это (мои питоны немного ржавые), но он должен работать. – Xonar

+0

@ Xonar: Довольно уверен, что вы не можете хэш кортеж, содержащий не подлежащие стиранию предметы – Eric

+0

Да, правда. (Я действительно говорил, что мой python ржавый :)), но вы можете recursuvely добавить расщепляемые элементы в кортеж. например Поверните (1,2, [2,3]) в (1,2, (2,3)) Спасибо, что указали это. – Xonar

ответ

1

тривиальным:

idmap = {} 
idmap[id(x)] = y 

Используйте id из x как ключ словаря

+0

Отлично, спасибо. Сегодня я узнал о функции id! –

+0

Обратите внимание, что для пользовательских классов 'hash (x)' по умолчанию 'id (x)' - здесь вы найдете здесь 'id' в некоторых случаях. – Eric

0

Цель IdentityHashMap Java - имитировать динамическое поле. Поскольку Python язык уже поддерживает динамические атрибуты напрямую, вам не нужна карта, просто присвоить Y, чтобы приписать Х

x.someSuchRelation = y; 
+0

Не все объекты в Python поддерживают динамические атрибуты! – Gabe

0

Для этого вы можете использовать обычный Python dict, если вы обмениваете ваши нераскрывающиеся объекты в другом объекте. В частности, что-то вроде этого:

class Wrapper(object): 
    def __init__(self, o): 
     self.o = o 

    def __hash__(self): 
     return id(self.o) 

    def __eq__(self, o): 
     return hash(self) == hash(o) 

Тогда просто использовать его как some_dict[Wrapper(unhashable_object)].

Это более полезный подход, чем использование id(o) в качестве ключа, если вам также необходимо иметь доступ к самому объекту впоследствии (как, например, key.o). Если вы этого не сделаете (и сбор мусора не проблема), просто используйте это.

Смежные вопросы