Безопасно ли использовать замороженный набор в качестве ключа 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 является неизменным и хэшируемым - его содержимое не может быть изменено после его создания; поэтому его можно использовать как ключ словаря или как элемент другого набора.

И излишне, из словаря документов:

... ключи, которые могут быть любого неизменного типа


Для пояснения, набор (по определению), замороженный или нет, не сохраняет порядок. Они хранятся внутри системы с учетом порядка, который не учитывается, и с удалением дублирующих элементов, поэтому два набора, построенные в разных порядках, будут эквивалентными ключами в словаре - они одинаковы

>>> 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 является неизменным и хэшируемым - его содержимое не может быть изменено после его создания; поэтому его можно использовать как ключ словаря или как элемент другого набора.

(Акцент мой)

Другие вопросы по тегам