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

如何在Python函数中打印目标节点值?解决Trie树插入KeyError报错

问题核心定位
  • 本次的KeyError: 'a'报错和字典初始化无关,完全是代码执行顺序、变量指向逻辑写反导致的:
    1. 进入if l not in node.children1分支后,你先给当前父节点的children1字典存了新创建的子节点,紧接着第一时间把node变量的指向切到了这个新子节点上
    2. 后续再执行print(node.children1[l])时,node已经是那个刚创建、children1为空字典的新子节点了。这时候再用原字符l去查这个新节点的children1,字典里根本没有对应键,自然抛出KeyError。
  • 原代码的Trie设计本身也存在偏差:你把node.valid = True写在了新建节点的分支里,等于每一层的中间节点都会被标记成有效单词结尾,不符合Trie的常规逻辑——应该等遍历完单词的所有字符后,给最后停留的节点设置valid=True才对。
正确的打印实现方式
  • 不需要绕路从已经切换指向的node里二次查字典,新建节点时直接把节点引用存为临时变量,想打印节点的任何属性直接读临时变量就行,从根源上避免KeyError:
    def insert(self, word: str) -> None:
        node = self.root
        for l in word:
            if l not in node.children1:
                # 新建子节点,直接存为临时变量
                new_child = trie_node()
                node.children1[l] = new_child
                # 直接打印目标节点,完全不需要二次查字典
                print(f"当前新建的目标节点对象: {new_child}")
                print(f"目标节点对应字符: {l}, 子节点字典: {new_child.children1}, valid状态: {new_child.valid}")
            # 等完成新建、打印逻辑后,再统一把node切到当前层的子节点
            node = node.children1[l]
        # 遍历完整个单词,给最后停留的节点标记valid=True
        node.valid = True
    
  • 额外注意:调用obj.insert('apple')时不要额外套print,因为insert方法没有返回值,套了最后只会输出None,所有需要打印的内容直接写在insert方法内部即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 05:06:03