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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:24:38