You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在支持双向查找的可逆哈希表类数据结构?

实现严格一一对应的双向哈希表(可逆映射)

嘿,这个需求太常见啦!既然你的数字和单词是严格一一对应的,完全不用手动复制两份数据来实现双向查找——咱们可以通过封装一个简单的类来搞定,既高效又能保证映射的一致性。

方法一:自定义双向映射类(推荐)

这个方案最灵活,还能自动维护正向和反向映射的同步,避免手动维护两份数据出现不一致的问题。直接看代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:30:33