如果我们有2个单独的dict
,两者都有相同的keys
和values
,那么当我们打印它们时,它会按照预期的顺序排列。
所以,假设我想在hash()
上使用dict
:
hash(frozenset(dict1.items()))
hash(frozenset(dict2.items()))
我这样做是为了创建一个新的dict
,并将hash()
值创建为新密钥。
即使在打印dict
时显示不同,hash()
创建的值总是相等的?如果不是,如何使它始终相同,以便我可以成功进行比较?
答案 0 :(得分:4)
如果键和值hash
相同,frozenset
被设计为基础值的稳定且唯一的表示。 The docs explicitly state:
当且仅当每一组中的每个元素都包含在另一组中时,两组相等(每一组都是另一组的子集)。
the rules for hashable types require that:
比较相等的Hashable对象必须具有相同的哈希值。
因此,根据定义frozenset
s具有相等的,可散列元素是相等的并且散列到相同的值。只有在生成的frozenset
中包含不遵守哈希和相等规则的用户定义的类时,才会违反这一点。(但之后您遇到了更大的问题)。
请注意,这并不意味着他们会以相同的顺序迭代或产生相同的repr
;由于链接哈希冲突,从不同顺序的相同元素构造的两个frozenset
不需要以相同的顺序迭代。但它们仍然彼此相等,并且相同(精确的输出和排序依赖于实现,可能很容易在不同版本的Python之间变化;这恰好适用于我的Py 3.5安装以创建所需的&# 34;不同的迭代顺序"行为):
>>> frozenset([1,9])
frozenset({1, 9})
>>> frozenset([9,1])
frozenset({9, 1}) # <-- Different order; consequence of 8 buckets colliding for 1 and 9
>>> hash(frozenset([1,9]))
-7625378979602737914
>>> hash(frozenset([9,1]))
-7625378979602737914 # <-- Still the same hash though
>>> frozenset([1,9]) == frozenset([9,1])
True # <-- And still equal