CS50 Pset6 DNA Python解法小库运行正常大库报索引越界错误
问题定位
索引越界错误出在统计各STR最长连续重复次数的循环逻辑中,核心原因是循环遍历范围写错:
STR = list(dna_database[0].keys())[1:] STR_match ={} # 错误代码段 for i in range(len(dna_database)): STR_match[STR[i]] = longest_match(sequence,STR[i])
这里range()传入的参数是len(dna_database),代表数据库里存储的人员条目总数,而你实际需要遍历的是所有STR类型,也就是STR列表的长度。
- 小型测试库(small.csv)包含3种STR,同时刚好存储3条人员数据,两者长度相等,循环时
i的取值始终在STR列表的合法下标范围内,因此可以正常运行 - 大型数据库(large.csv)仅包含8种STR,但存储了20余条人员数据,当循环变量
i增长到8时,STR[i]会访问不存在的列表下标,直接触发IndexError: List Index Out of range错误
你之前打印数据库内容没定位到问题,是因为文件读取逻辑本身完全正常,错误出在读取完成后的循环遍历逻辑上。
修复方法
将这段循环的遍历范围改为STR列表的长度即可,更稳妥的写法是直接遍历STR列表本身,从根源上避免下标计算错误:
STR = list(dna_database[0].keys())[1:] STR_match ={} # 修复后代码 for str_type in STR: STR_match[str_type] = longest_match(sequence, str_type)
修改完成后,代码在大小数据库上均可正常运行,后续的人员匹配逻辑无需调整。
调试技巧
后续遇到同类下标越界问题,可以在访问列表的代码前加一行打印,输出当前下标值、被访问列表的总长度,就能快速定位范围不匹配的问题:
for i in range(len(dna_database)): # 调试打印 print(f"当前下标:{i},STR列表长度:{len(STR)},数据库人员行数:{len(dna_database)}") STR_match[STR[i]] = longest_match(sequence,STR[i])
运行后可以直观看到,当i增长到8时,STR列表长度仅为8(合法下标范围为0-7),马上就能定位到循环范围写错的问题。
内容的提问来源于stack exchange,提问作者Prateek Chaturvedi
相关产品推荐
相关产品推荐

