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

Python常规列表索引替代方案:解决字典含空列表时的索引越界问题

问题根因

你当前的写法错误地假设过滤空列表后,holes_to_test列表的索引和原字典的数字键仍然满足「索引 = 键值-1」的对应关系:当原字典中间的键对应空列表被过滤掉后,holes_to_test的长度会小于原最大键值,此时用test_row - 1取索引就会超出列表最大下标,触发越界错误。
比如测试用例{1:[1, 2, 3], 2:[501, 555, 999], 3:[], 4:[1501, 1999, 2000]}过滤后:

  • lines_to_test = [1,2,4]
  • holes_to_test = [[1,2,3], [501,555,999], [1501,1999,2000]],列表最大索引是2
    循环到test_row=4时,4-1=3已经超过了列表最大索引2,直接报错。

最优解决方案

直接用原字典做映射取值,不需要额外维护索引关系,因为lines_to_test里的键本身就对应非空的列表值,修改最后一段循环逻辑即可,完全不需要修改原字典的键:

for test_row in lines_to_test:
    print("test_row : ", test_row)
    print("    holes to test : ", user_return_dict[test_row])

替代方案(需保留holes_to_test的场景)

如果必须保留holes_to_test变量,可将其改为字典结构,直接通过键取值,不需要计算索引:

# 把原来的列表推导式改成字典推导式即可
holes_to_test = {k:v for k,v in user_return_dict.items() if v}

for test_row in lines_to_test:
    print("test_row : ", test_row)
    print("    holes to test : ", holes_to_test[test_row])

最低修改成本方案

如果不想修改前面的变量定义,可直接同时遍历lines_to_test和holes_to_test,两个列表的顺序是严格对应的,不需要索引计算:

for test_row, holes in zip(lines_to_test, holes_to_test):
    print("test_row : ", test_row)
    print("    holes to test : ", holes)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:45:01