使用冷冻套装作为Dict钥匙是否安全?

bal*_*lki 9 python hashmap python-2.7 frozenset

它显然有效,但有两种相同的元素碰巧在Dict中添加两个条目的情况?我想我之前得到了这个条件并将我的代码更改frozenset(...)tuple(sorted(frozenset(...))).知道Dict和冻结集实现如何确认是否需要的人可以吗?

Joh*_*ing 20

它是安全的使用frozenset作为dict重点?是.

根据文档,Frozenset是可以清除的,因为它是不可变的.这意味着它可以用作dict的键,因为键的先决条件是它是可清除的.

来自FrozenSet文档

frozenset类型是不可变的和可散列的 - 其内容在创建后不能更改; 因此,它可以用作字典键或另一组的元素.

并且冗余地,来自词典文档:

...键,可以是任何不可变类型


为了澄清,一组(按定义),冻结与否,不保留秩序.它们在内部存储,不考虑订单并删除了重复元素,因此以不同顺序构建的两个集合将是字典中的等效键 - 它们是相同的.

>>> frozenset([1,2,2,3,3]) == frozenset([3,2,1,1,1])
True
Run Code Online (Sandbox Code Playgroud)

同样地,

>>> 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'
Run Code Online (Sandbox Code Playgroud)

  • 我认为这是可以理解的,因为根据定义,集合不保留顺序。 (2认同)

geo*_*org 12

有两种相同元素碰巧在Dict中添加两个条目的情况吗?

编号frozenset哈希算法不依赖于元素的顺序,仅依赖于元素本身.具有相同元素的两个FS'相等且具有相等的哈希值,因此满足"dict身份"的两个标准,换句话说,它们是相同的dict键:

>>> 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}
Run Code Online (Sandbox Code Playgroud)


gbo*_*ffi 7

来自官方文档

frozenset类型是不可变的和可散列的 - 其内容在创建后不能更改; 因此,它可以用作字典键或另一组的元素.

(重点是我的)