Безопасно ли использовать замороженный набор в качестве ключа Dict?
Это, очевидно, работает, но есть ли случаи, когда два набора одинаковых элементов добавляют две записи в Dict? Я думаю, что я получил это условие раньше и изменил свой код с frozenset(...)
в tuple(sorted(frozenset(...)))
, Может кто-то, кто знает, как реализация Dict и frozenset подтверждает, требуется ли это или нет?
3 ответа
бывают ли случаи, когда два набора одинаковых элементов добавляют две записи в Dict?
Нет. frozenset
Алгоритм хэширования не зависит от порядка элементов, только от самих элементов. Два FS с одинаковыми элементами равны и имеют одинаковые хэши, таким образом, удовлетворяя обоим критериям "диктованной идентичности", другими словами, они являются одним и тем же ключом дикта:
>>> a = frozenset([1,1,1,1,2,3])
>>> b = frozenset([3,3,3,3,2,1])
>>> {a:1, b:2}
{frozenset([1, 2, 3]): 2}
Согласно документам, Frozenset является хэшируемым, потому что он неизменен. Это будет означать, что его можно использовать в качестве ключа к диктовке, поскольку обязательным условием для ключа является его хешируемость.
Тип frozenset является неизменным и хэшируемым - его содержимое не может быть изменено после его создания; поэтому его можно использовать как ключ словаря или как элемент другого набора.
И излишне, из словаря документов:
... ключи, которые могут быть любого неизменного типа
Для пояснения, набор (по определению), замороженный или нет, не сохраняет порядок. Они хранятся внутри системы с учетом порядка, который не учитывается, и с удалением дублирующих элементов, поэтому два набора, построенные в разных порядках, будут эквивалентными ключами в словаре - они одинаковы
>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1])
True
и так же,
>>> d = {}
>>> d[frozenset([1,1,2,3])] = 'hello'
>>> d[frozenset([1,2,3,3])]
'hello'
>>> d[frozenset([3,3,3,2,1,1,1])]
'hello'
>>> d[frozenset([2,1,3])]
'hello'
Тип frozenset является неизменным и хэшируемым - его содержимое не может быть изменено после его создания; поэтому его можно использовать как ключ словаря или как элемент другого набора.
(Акцент мой)