如何构建多级字典:实现行情数据的嵌套字典结构存储
如何构建嵌套字典存储股票每日价格列表?
你的问题核心是处理嵌套字典的键不存在时的初始化逻辑——直接尝试追加到crude_base[ticker][date]对应的列表时,如果ticker或date还未在字典中创建,就会抛出KeyError。下面提供两种可行的解决方案:
方法一:手动判断并初始化结构
这种方法直观易懂,通过条件判断确保每一层字典和列表都已初始化,再进行价格追加:
crude_base = {} for item in datafiles: # 用with语句安全打开文件,自动处理关闭 with open(item, 'r') as file_object: for line in file_object: # 先去除换行符再分割,避免多余空白 line = line.strip().split(';') date = line[0] ticker = line[2] # 将价格转为浮点数,方便后续数值计算 price = float(line[3]) # 1. 检查顶层ticker是否存在,不存在则创建空字典 if ticker not in crude_base: crude_base[ticker] = {} # 2. 检查当前ticker下的日期是否存在,不存在则创建空列表 if date not in crude_base[ticker]: crude_base[ticker][date] = [] # 3. 追加价格到对应列表 crude_base[ticker][date].append(price)
运行这段代码后,你会得到符合需求的嵌套字典:比如针对你提供的示例数据,crude_base['MGNT']['20190920']的值会是[3616.0, 3617.0],完全匹配你想要的结构。
方法二:用collections.defaultdict简化代码
如果你想让代码更简洁,可以使用Python标准库中的defaultdict,它会自动为不存在的键生成默认值,省去手动判断的步骤:
from collections import defaultdict # 顶层字典:键是ticker,值是一个默认生成空列表的字典 crude_base = defaultdict(lambda: defaultdict(list)) for item in datafiles: with open(item, 'r') as file_object: for line in file_object: line = line.strip().split(';') date = line[0] ticker = line[2] price = float(line[3]) # 直接追加即可,不存在的键会自动初始化 crude_base[ticker][date].append(price)
可选:转成普通字典
如果后续需要将defaultdict转为普通字典(比如用于序列化、打印等场景),可以用字典推导式:
regular_dict = {ticker: dict(date_dict) for ticker, date_dict in crude_base.items()}
内容的提问来源于stack exchange,提问作者Igor K.
相关产品推荐
相关产品推荐

