#python
#python
Вопрос:
Хорошо, я пробую еще раз, извините, если я был неясен, это была моя первая попытка спросить здесь что-то.
# I have such class
# p1 is immutable and uniq. It's using for search
# p2 is mutable parameter
class SomeHashableObject():
def __init__(self, p1)
self.p1 = p1
self.p2 = []
def __hash__(self):
return hash(self.p1)
def __eq__(self, other):
return self.p1==other.p1
Например, у меня есть 2 разных SomeHashableObject.
#Creating and saving
obj_1 = SomeHashableObject(1)
obj_1.p2 = ['a', 'b']
obj_2 = SomeHashableObject(4)
obj_2.p2 = ['c', 'd']
Теперь я хочу сохранить свои объекты, а затем найти тот, где p1 = 4
Первый способ сохранения и поиска (список)
# Storing
obj_list = [obj_1, obj_2]
# Searching
result = next(obj for obj in obj_list if obj.p1==4)
Второй способ хранения и поиска (хэш-таблица)
# Storing
obj_dict = {
obj_1: obj_1,
obj_2: obj_2
}
# Searching
obj_to_search = SomeHashableObject(4)
result = obj_dict[obj_to_search]
Является ли второй способ приемлемым (или лучше)?
Надеюсь, теперь все понятно)
Комментарии:
1. Я не понимаю, чего вы пытаетесь достичь.
dictionary[obj_to_find].obj_attribute
У вас уже естьobj_to_find
, зачем вам нужен поиск dict,dictionary[obj_to_find]
который вернет точно то же самоеobj_to_find
?2. Обычно ключ и значение в словаре разные. В противном случае, если у вас уже есть объект, зачем искать его в словаре? Возможно, ваш класс странный в том смысле, что экземпляры, которые кажутся одинаковыми, отличаются в деталях, но в данном случае это привело к запутыванию кода.
3. Вероятно, было бы более полезно иметь
{'some_key': obj_to_find}
, иначе вам нужен объект для поиска объекта, что не имеет смысла4. @HFBrowning Например, если хэш вычислялся медленно, было много столкновений или коллекция была очень маленькой.
5. @Monitor-1 потому что значение хэша — это не то, что используется в качестве подстановки в словаре . Хешируемый объект является . Вы могли бы взломать свой путь к внутренним компонентам CPython и попытаться сделать это. Или вы могли бы просто создать нужную вам карту напрямую . Какими бы ни были ваши «первичные ключи», просто используйте их как объект, который будет прямым ключом. Наличие dict, который просто сопоставляет объект самому себе, не имеет смысла