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
相关产品推荐
相关产品推荐

