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

时间:2015-02-17 16:58:15

标签: python python-2.7 hashmap frozenset

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

3 个答案:

答案 0 :(得分:18)

使用frozenset作为dict密钥是否安全?

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

来自FrozenSet docs

  

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

多余地,来自Dictionary docs

  

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


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

>>> 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'

答案 1 :(得分:9)

  

是否存在两组相同元素恰好在Dict中添加两个条目的情况?

没有。 frozenset hashing algorithm并不取决于元素的顺序,只取决于元素本身。具有相同元素的两个FS具有相同且具有相等的哈希值,从而满足" dict identity"的两个标准,换句话说,它们是相同的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}

答案 2 :(得分:7)

来自the official docs

  

冻结类型是不可变的和可散列的 - 其内容在创建后不能更改; 因此可以用作词典键或作为另一组词的元素。

(重点是我的)