Python字典遍历转换:子表键已存在时追加字段避免覆盖
问题原因
你的代码出现覆盖问题的核心原因是每次循环都会无条件执行refs[tables[0]] = {}:无论当前子表之前是否已经写入过关联关系,这行代码都会直接把该子表对应的内层字典重置为空,后续再往空字典里加新的关联字段,之前存的内容自然就被覆盖了。
修正方案
方案1:添加存在性判断(符合要求的条件判断逻辑)
只需要把内层字典的初始化逻辑放到条件分支里:仅当子表第一次出现在结果中时,才初始化空字典;如果子表已存在,直接往已有的内层字典追加字段映射即可。
优化后的代码如下:
refs = {} for (child_table, parent_table), (child_fields, parent_fields) in RELS.items(): # 子表不存在时才初始化内层空字典 if child_table not in refs: refs[child_table] = {} # 用zip直接配对位置对应的子/父表字段,比索引遍历更简洁 for c_field, p_field in zip(child_fields, parent_fields): refs[child_table][c_field] = (parent_table, p_field)
运行后就能得到目标结构,同一个子表关联多个父表的字段会全部保留,不会被覆盖。
方案2:用defaultdict简化逻辑
如果不想手动写存在性判断,可以用标准库collections里的defaultdict,它会在访问不存在的键时自动初始化对应类型的空值:
from collections import defaultdict refs = defaultdict(dict) for (child_table, parent_table), (child_fields, parent_fields) in RELS.items(): for c_field, p_field in zip(child_fields, parent_fields): refs[child_table][c_field] = (parent_table, p_field) # 如果需要输出普通原生dict,加这行转换即可 refs = dict(refs)
内容的提问来源于stack exchange,提问作者Sergiy Polovynko
相关产品推荐
相关产品推荐

