2016-11-18 3 views
3

у меня есть словарь d который хранит информацию об объектах: возникаютИспользование объектов в качестве словаря ключей

class A: 
    def __init__(self, x): 
     self.x = x 

a = A(1) 
b = A(1) 
c = 'hello world' 
e = [1, 2, 3] 

d = {a: 'a', b: 'b', c: 'c', e: 'e'} 

Два вопроса:

  1. подход не работает для списков или для других объектов, хэш не соответствует адресу хранилища. Что я могу сделать в этих случаях?
  2. Этот подход небезопасен в других условиях, чем упомянутый в вопросе (1)?
+0

В чем смысл словаря, чьи ключи являются значением? Он будет поддерживаться только в том случае, если объект hashable (имеет значение __hash__). Что случилось с использованием списка или набора? –

+0

Итак, вы пытаетесь использовать объекты в качестве ключей в словаре. Я не понимаю эту мотивацию. – pylang

+0

Должны ли вы иметь объекты в качестве ключей словаря? Не можете ли вы сделать что-то вроде сохранения объекта в отдельном списке и использовать индексы этого списка в качестве ключей? – Ulisha

ответ

2

Для того, чтобы использовать в качестве ключа словаря, объект должен поддерживать hash функцию (например, через __hash__), сравнение равенства (например, через __eq__ или __cmp__), а должно удовлетворять условию корректности выше.

Это говорит о том, что простой ответ на вопрос, почему списки не могут использоваться в качестве словарных ключей, состоит в том, что списки не предоставляют действительный метод __hash__.

Для получения более подробной информации, пожалуйста, обращайтесь к Why Lists Can't Be Dictionary Keys?.

Но вы можете использовать объект tuple() вместо key, поскольку кортежи хешируются. Следовательно, это действительно так:

>>> e = (1, 2, 3) 
>>> d = {a: 'a', b: 'b', c: 'c', e: 'e'} 
Смежные вопросы