它显然有效,但是否存在两组相同元素碰巧在字典中添加两个条目的情况?我想我早先得到了这个条件,并将我的代码从 更改frozenset(...)
为tuple(sorted(frozenset(...)))
。知道 Dict 和 freezeset 实现方式的人可以确认是否需要这样做吗?
问问题
25851 次
3 回答
29
使用 afrozenset
作为dict
密钥是否安全?是的。
根据文档,Frozenset 是可散列的,因为它是不可变的。这意味着它可以用作字典的键,因为键的先决条件是它是可散列的。
freezeset 类型是不可变和可散列的——它的内容在创建后不能更改;因此,它可以用作字典键或另一个集合的元素。
并且冗余地,来自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'
于 2015-02-17T17:03:20.197 回答
22
是否存在两组相同元素碰巧在字典中添加两个条目的情况?
不,frozenset
散列算法不依赖于元素的顺序,只依赖于元素本身。具有相同元素的两个 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}
于 2015-02-17T17:27:46.187 回答
8
于 2015-02-17T17:04:11.387 回答