如何对Python中顺序不同的等价状态进行哈希以实现比较?
解决Python中等价状态的哈希判定问题
要让这两个外层子列表顺序不同但实际等价的状态能被判定为相等,同时能正常哈希,核心是消除外层子列表的顺序差异,并且把不可哈希的列表转成可哈希类型,具体分两种场景处理:
场景1:子列表内部元素顺序固定(如示例中的[1,5,6]和[8,2,1]各自内部顺序有意义)
只需要把每个子列表转成元组(元组是可哈希类型),再对这些元组进行排序,最后转成一个大元组。这样不管外层子列表的顺序如何,处理后的结果都会完全一致:
state1 = [ [1,5,6], [8,2,1] ] state2 = [ [8,2,1], [1,5,6] ] def get_hashable_state(state): # 子列表转元组 → 排序 → 转大元组 return tuple(sorted(tuple(sublist) for sublist in state)) # 验证相等性 print(get_hashable_state(state1) == get_hashable_state(state2)) # 输出 True # 验证哈希值相同 print(hash(get_hashable_state(state1)) == hash(get_hashable_state(state2))) # 输出 True
场景2:子列表内部元素顺序也无意义(比如[1,5,6]和[5,1,6]也算等价)
这种情况下需要进一步把每个子列表内部也排序后再转元组,再对外层排序:
def get_hashable_state(state): # 子列表内部排序→转元组 → 外层排序 → 转大元组 return tuple(sorted(tuple(sorted(sublist)) for sublist in state))
注意点
- 为什么不用集合?如果状态中存在重复的子列表(比如
[[1,5,6], [1,5,6]]),集合会自动去重,导致错误判定,而排序的方式会保留重复项,适用性更广。 - 元组是可哈希类型,而列表不可哈希,所以必须转换后才能计算哈希值。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

