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

如何构建多级字典:实现行情数据的嵌套字典结构存储

如何构建嵌套字典存储股票每日价格列表?

你的问题核心是处理嵌套字典的键不存在时的初始化逻辑——直接尝试追加到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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:39