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

如何继承dict实现双向一对一映射类的__setitem__与__init__方法?

实现双向一对一映射的Dict子类

嘿,我帮你搞定了这个双向映射类的完整实现,完全贴合你的需求,咱们一步步拆解来看:

class Mapping(dict):
    def __init__(self, map_data=None):
        # 修正原代码的语法错误,处理空构造场景
        if map_data is None:
            map_data = {}
        # 遍历传入字典,逐个调用__setitem__确保双向映射的正确性
        for key, value in map_data.items():
            self[key] = value

    def __setitem__(self, key1, key2):
        # 先清理已存在的冲突映射
        # 如果key1已有对应值,移除它的双向映射
        if key1 in self:
            old_val = self[key1]
            super().__delitem__(old_val)
            super().__delitem__(key1)
        # 如果key2已有对应值,同样移除它的双向映射
        if key2 in self:
            old_key = self[key2]
            super().__delitem__(old_key)
            super().__delitem__(key2)
        
        # 避免key和value相同时重复添加
        if key1 != key2:
            super().__setitem__(key1, key2)
            super().__setitem__(key2, key1)
        else:
            super().__setitem__(key1, key2)

关键逻辑说明:

  • __init__方法修正:原代码里的if Map = None是语法错误,改成if map_data is None更规范。通过遍历传入字典的键值对并调用__setitem__,能自动处理传入数据中的冲突,保证双向映射的一致性。
  • __setitem__核心逻辑:
    1. 冲突清理:如果要设置的key1或key2已经在映射里,先把它们原来的双向映射全部移除——比如key1之前对应old_val,就删掉key1:old_val和old_val:key1,防止残留无效映射。
    2. 双向添加:处理完冲突后,添加key1:key2和key2:key1的双向映射;如果key1和key2是同一个值,只添加一次,避免字典里出现重复键。
    3. 复用父类方法:用super()调用dict的原生方法,不破坏底层逻辑,只是在其基础上叠加双向映射规则。

测试示例:

# 空构造测试
m1 = Mapping()
m1["a"] = "b"
print(m1)  # 输出: {'a': 'b', 'b': 'a'}

# 从字典构造测试(自动处理冲突)
m2 = Mapping({"x": "y", "y": "z"})
print(m2)  # 输出: {'x': 'y', 'y': 'x'}(原y:z被覆盖)

# 覆盖已存在映射测试
m1["a"] = "c"
print(m1)  # 输出: {'a': 'c', 'c': 'a'}(原a:b和b:a已被移除)

内容的提问来源于stack exchange,提问作者Discrete

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:17:06