CS50 Pset6 DNA匹配程序异常:始终返回No match求助
CS50 Pset6 DNA匹配问题修复方案
问题根源
你的代码存在两个核心问题导致无法匹配到正确人名:
类型不匹配
CSV文件中读取的STR重复次数是字符串类型(比如"5"),而longest_match函数返回的是整数类型(比如5),直接用==比较会判定为不相等。匹配逻辑错误
当前嵌套循环只要检测到某一个STR匹配就立即返回人名,但正确逻辑应该是该人员的所有STR重复次数都与检测结果完全一致才判定为匹配。
修复后的代码
import csv import sys def main(): # 检查命令行参数 if len(sys.argv) != 3: print("Usage: ./dna.py [FILE.csv] [FILE.txt]") return headers = [] rows = [] with open(sys.argv[1]) as file: reader = csv.DictReader(file) headers = reader.fieldnames.copy() # 简化headers的获取方式 for row in reader: rows.append(row) # 读取DNA序列 with open(sys.argv[2], "r") as txtfile: sequence = txtfile.read() # 获取每个STR的最长连续重复次数 mostRepeats = [] # 跳过name列,只处理STR类型 for str_name in headers[1:]: mostRepeats.append(longest_match(sequence, str_name)) # 遍历所有人员,检查是否完全匹配 for person in rows: match_flag = True # 逐个对比STR重复次数 for idx in range(len(mostRepeats)): str_name = headers[idx + 1] # 将CSV中的字符串转为整数后比较 if int(person[str_name]) != mostRepeats[idx]: match_flag = False break if match_flag: print(person['name']) return print("No match") return def longest_match(sequence, subsequence): """Returns length of longest run of subsequence in sequence.""" longest_run = 0 subsequence_length = len(subsequence) sequence_length = len(sequence) for i in range(sequence_length): count = 0 while True: start = i + count * subsequence_length end = start + subsequence_length if start >= sequence_length: break if sequence[start:end] == subsequence: count += 1 else: break longest_run = max(longest_run, count) return longest_run main()
关键修复点说明
- 类型转换:在比较STR次数时,将CSV中读取的字符串值通过
int()转为整数,与longest_match返回的整数进行对比。 - 匹配逻辑优化:对每个人员设置匹配标记,只有当所有STR的重复次数都与检测结果一致时,才输出该人员姓名并退出程序。
- 简化代码:优化了headers的获取方式,直接使用
reader.fieldnames.copy()替代循环添加,同时跳过name列处理STR,减少不必要的计算。
内容的提问来源于stack exchange,提问作者M11
相关产品推荐
相关产品推荐

