CS50 Week6 DNA序列识别程序测试失败,请求错误分析
DNA匹配代码错误详细分析
核心错误:变量名混淆导致逻辑混乱
你在代码里重复使用相似变量名,直接让匹配逻辑完全跑偏:
- 先定义了存储所有DNA子序列的列表:
subsequence = list(database[0].keys())[1:] - 遍历子序列时用了
for subsequences in subsequence:,这里subsequences变成了单个子序列字符串(比如AGATC) - 到匹配用户的循环里,你写了
for subsequence in subsequences:,此时subsequences是单个字符串,循环会遍历这个字符串的每个字符,而非遍历所有需要匹配的子序列列表 - 同时判断条件里的
person[subsequences]和result[subsequences],都是在拿单个子序列对应的值,根本没逐个检查所有子序列
匹配逻辑的顺序错误
就算变量名没搞错,你的判断时机也有问题:
- 每次检查一个子序列后就立刻判断
match == len(subsequences),这会导致只要第一个子序列匹配,就直接返回当前用户,完全不验证其他子序列是否匹配 - 比如sequences/3.txt本应输出
No match,但因为Bob的第一个子序列和计算结果匹配,就直接输出Bob了,根本没验证其他子序列
次要错误:命令提示拼写错误
print("Usage: python dna,py data.csv sequence.txt")里的逗号应该是点,正确写法是dna.py
修正后的核心代码片段
理清变量名,调整匹配判断的位置:
# 重命名变量避免混淆,存储所有待匹配的子序列 subseqs = list(database[0].keys())[1:] result = {} for subseq in subseqs: result[subseq] = longest_match(dna_sequence, subseq) for person in database: match = 0 # 遍历所有子序列逐个验证 for subseq in subseqs: if int(person[subseq]) == result[subseq]: match += 1 # 所有子序列都匹配后再输出结果 if match == len(subseqs): print(person["name"]) return print("No Match")
内容的提问来源于stack exchange,提问作者user25122503
相关产品推荐
相关产品推荐

