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

解析字典时触发IndexError: list index out of range错误,求排查

解决IndexError: list index out of range问题

让我帮你一步步找出代码里的问题,然后修正它:

错误原因分析

你的代码里有几个关键的逻辑错误,直接导致了索引越界:

  1. 内层循环遍历对象错误
    你内层循环写的是for eachnode in file_dict["KPIS"],但你实际需要遍历的是节点列表file_dict["NODES"]——你要给每个节点对应填充KPI的状态值,而不是遍历所有KPI。这个错误会让你在访问eachnode[ind + 1]时,很快就超出列表的索引范围。

  2. KPI名称获取方式错误
    eachnode[0][0]是完全错误的写法:eachnode是KPIS里的单个KPI列表,eachnode[0]已经是KPI的名称字符串(比如VoLTE MO Voice Connection Rate(%)),不需要再额外取[0]。

  3. 行数据初始化错误
    t = [eachkpi]会把整个KPI列表(包含名称和所有节点状态)放进行数据里,而你需要的是把KPI名称作为行的第一个元素,应该写成[eachkpi[0]]。

修改后的代码

rows = []
headers = ["Kpis"]

for filename in file_list:
    # 用with语句自动管理文件关闭,更安全
    with open(filename, 'r') as f:
        file_content = f.read()
    file_string = json.loads(file_content)
    # 替换eval为更安全的ast.literal_eval(如果是Python字典格式字符串)
    import ast
    file_dict = ast.literal_eval(file_string)
    
    if "KPIS" in file_dict and "NODES" in file_dict:
        # 仅第一次获取表头,避免重复添加
        if len(headers) == 1:
            headers.extend(file_dict["NODES"])
        
        node_count = len(file_dict["NODES"])
        for eachkpi in file_dict["KPIS"]:
            # 检查KPI数据长度是否匹配节点数量,提前规避索引问题
            if len(eachkpi) - 1 != node_count:
                print(f"警告:KPI {eachkpi[0]} 的状态值数量与节点数不匹配")
                continue
            # 初始化行:第一个元素是KPI名称,后面追加所有节点的状态值
            t = [eachkpi[0]]
            t.extend(eachkpi[1:])
            rows.append(t)

额外优化建议

  • 替换eval:eval存在严重安全风险,若输入文件不可信,容易被注入恶意代码。如果file_string是Python字典格式字符串,建议用ast.literal_eval解析;如果是标准JSON,直接用json.loads即可,无需二次解析。
  • 添加边界检查:代码中加入了KPI数据长度与节点数的校验,能提前发现数据格式不一致的问题,避免后续索引错误。
  • 精简循环逻辑:把表头初始化放在第一次读取文件时完成,避免重复执行判断逻辑,提升效率。

内容的提问来源于stack exchange,提问作者canarcho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:23:12