如何向多级字典中的列表追加元素?解决遍历文件时的KeyError问题
解决多级字典构建中的KeyError问题
嘿,我来帮你搞定这个KeyError的问题!你遇到的情况大概率是首次遇到新的lvlOneKey时,对应的二级字典层级还没被初始化,直接去访问lvlOneKey下的lvlTwoKey自然就会触发键不存在的错误。
举个例子,假设你原本的代码大概是这样的:
my_dict = {} # 遍历文件行的逻辑 for line in open("your_file.txt"): lvlOneKey = line.split(",")[0] # 假设从行中提取一级键 lvlTwoKey = line.split(",")[1] # 提取二级键 valueFound = line.split(",")[2].strip() # 提取要存储的值 # 这里直接访问会报错!因为my_dict里可能还没有lvlOneKey这个键 my_dict[lvlOneKey][lvlTwoKey].append(valueFound)
当第一个新的lvlOneKey出现时,my_dict[lvlOneKey]根本不存在,Python找不到这个键,就会抛出KeyError。
两种可行的解决方法:
方法1:用collections.defaultdict自动初始化层级(推荐)
这个方法最简洁,利用Python标准库的defaultdict,可以让字典在遇到不存在的键时自动创建对应的默认结构:
from collections import defaultdict # 外层defaultdict会自动为新的lvlOneKey创建一个内层defaultdict,内层则自动创建空列表 my_dict = defaultdict(lambda: defaultdict(list)) for line in open("your_file.txt"): lvlOneKey = line.split(",")[0] lvlTwoKey = line.split(",")[1] valueFound = line.split(",")[2].strip() # 现在不管键是否存在,都可以直接append,不会报错 my_dict[lvlOneKey][lvlTwoKey].append(valueFound)
方法2:手动检查并初始化每个层级
如果你不想引入额外的库,可以手动判断每个键是否存在,不存在就创建对应的结构:
my_dict = {} for line in open("your_file.txt"): lvlOneKey = line.split(",")[0] lvlTwoKey = line.split(",")[1] valueFound = line.split(",")[2].strip() # 先检查一级键是否存在,不存在则创建空的二级字典 if lvlOneKey not in my_dict: my_dict[lvlOneKey] = {} # 再检查二级键是否存在,不存在则创建空列表 if lvlTwoKey not in my_dict[lvlOneKey]: my_dict[lvlOneKey][lvlTwoKey] = [] # 最后添加值到列表 my_dict[lvlOneKey][lvlTwoKey].append(valueFound)
核心逻辑就是确保每一层级的结构在被访问前已经存在,这样就不会再触发KeyError啦。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

