是否存在支持双向查找的可逆哈希表类数据结构?
实现严格一一对应的双向哈希表(可逆映射)
嘿,这个需求太常见啦!既然你的数字和单词是严格一一对应的,完全不用手动复制两份数据来实现双向查找——咱们可以通过封装一个简单的类来搞定,既高效又能保证映射的一致性。
方法一:自定义双向映射类(推荐)
这个方案最灵活,还能自动维护正向和反向映射的同步,避免手动维护两份数据出现不一致的问题。直接看代码:
class BidirectionalDict: def __init__(self, initial_data): # 存储正向映射:数字 → 单词 self._forward = dict(initial_data) # 生成反向映射:单词 → 数字(因为严格一一对应,不用担心值重复冲突) self._reverse = {value: key for key, value in initial_data.items()} def __getitem__(self, key): # 先查正向映射,如果找不到就查反向 if key in self._forward: return self._forward[key] elif key in self._reverse: return self._reverse[key] else: raise KeyError(f"找不到键:{key}") # 可选:支持修改映射,自动同步双向关系 def __setitem__(self, key, value): # 先清理旧的映射关系,避免残留 if key in self._forward: old_val = self._forward[key] del self._reverse[old_val] if value in self._reverse: old_key = self._reverse[value] del self._forward[old_key] # 添加新的双向映射 self._forward[key] = value self._reverse[value] = key
使用示例
# 初始化你的原始字典 dic = {0: 'food', 1: 'dinner', 2.5: 'breakfast'} # 转换成双向映射对象 bidict = BidirectionalDict(dic) # 正向查找:数字 → 单词 print(bidict[0]) # 输出: 'food' # 反向查找:单词 → 数字 print(bidict['breakfast']) # 输出: 2.5 # 支持修改映射,自动同步 bidict[3] = 'lunch' print(bidict['lunch']) # 输出: 3
为什么不用复制数据?
这里的反向映射_reverse并不是复制原始数据,只是基于原始键值对生成了一个反转的字典——内存里存储的只是对原始值的引用(对于不可变类型比如字符串、数字来说,几乎没有额外内存开销),比手动维护两个独立字典要高效得多,还能避免手动同步的麻烦。
注意事项
因为你的映射是严格一一对应的,所以必须保证所有的单词值都是唯一的——如果有重复值,生成反向映射时后面的键会覆盖前面的,这一点要提前确保哦。
内容的提问来源于stack exchange,提问作者0xmax
相关产品推荐
相关产品推荐

