Python双字典映射生成trsx文件sample节点异常修复
问题根因
先把你之前两段代码的核心问题说透:
- 第一版硬编码下标取文本的逻辑完全站不住脚:你把
Description_list的值转成列表靠固定位置取内容,本质是赌字典遍历顺序永远不变,只要模块下新增意图、字典加载顺序变了,立刻出现文本错位、匹配错误的问题。 - 第二版只有最后一个节点有文本的问题有两个:一是
SubElement没有放在内层循环里创建,全程复用同一个节点对象,前面给text赋的值全被后续循环覆盖,最后只剩最后一次赋值的内容;二是你直接把意图ID当节点文本赋值,根本没去Description_list里匹配对应的展示文案,模块前缀的判断全写在if分支里很容易写错(你贴的错误输出里HATE和HELLO的前缀都写反了)。
正确实现代码
首先把模块和intentref前缀的映射单独抽成配置,不要散在if判断里,后续加模块直接改配置就行:
import xml.etree.ElementTree as ET # 模块名对应intentref前缀的映射,和预期输出的规则完全对齐 MOD_PREFIX_CONF = { "ClickUrl": "MANAGE_URLS", "AngryUser": "NEGATIVE", "HelloGoodBye": "GREETING", "Social": "SOCIAL", "AgentMemory": "AGENT_MEMORY" } # 假设samples是你已经初始化好的<samples>父节点 # 直接双层遍历,不需要任何硬编码下标、不需要冗余if判断 for mod_name, intent_ids in ModName_Social.items(): current_prefix = MOD_PREFIX_CONF[mod_name] for intent_id in intent_ids: # 【关键】每遍历一个意图就新建一个sample节点,绝对不能复用之前的节点对象 sample_node = ET.SubElement(samples, "sample") # 拼接固定属性和规则属性 sample_node.set("intentref", f"{current_prefix}_{intent_id}") sample_node.set("count", "1") sample_node.set("excluded", "true") # 直接用意图ID当key取对应描述文本,不需要转列表按下标找 sample_node.text = Description_list[intent_id]
效果说明
运行后生成的节点和你给出的预期输出完全一致,不存在文本错位、空节点的问题:
- 适配任意单模块多意图场景,后续给任意模块新增意图ID,只要同步在
Description_list里加好对应文案,不需要改遍历逻辑 - 没有硬编码索引,完全靠字典键做匹配,不受字典遍历顺序影响
- 前缀配置统一维护,不会出现之前if分支写错前缀的低级错误
内容的提问来源于stack exchange,提问作者nikom
相关产品推荐
相关产品推荐

