CS50 Week6 DNA识别程序匹配错误,寻求技术帮助
CS50 Week6 DNA识别程序匹配异常修复
你的代码存在三个核心逻辑错误,导致匹配结果异常:
错误点分析
冗余且干扰的
match变量
在计算STR最长匹配序列的循环中,你定义的match变量完全没有实际作用,反而会在后续的匹配检查中残留初始值,干扰判断逻辑。未重置匹配计数器
遍历每个人员档案时,没有在每次循环开始时将匹配计数器重置为0,导致计数器会累加前一个人员的匹配次数,引发错误匹配。匹配成功的判断条件错误
你用match == len(subsequence)判断是否匹配,这是将匹配成功的STR数量和单个STR的长度做对比,逻辑完全错误。正确的条件应该是匹配成功的STR数量等于数据库中STR的总数量(即match == len(subsequences)),且需要在遍历完所有STR后再进行判断,避免提前错误返回。
修正后的代码
import csv import sys def main(): # 检查命令行参数 if len(sys.argv) != 3: sys.exit("Usage: python dna.py data.csv sequence.txt") # 读取数据库文件 database = [] with open(sys.argv[1], 'r') as file: reader = csv.DictReader(file) for row in reader: database.append(row) # 读取DNA序列文件 with open(sys.argv[2], 'r') as file: dna_sequence = file.read() # 获取所有STR子序列(跳过name列) subsequences = list(database[0].keys())[1:] # 计算每个STR的最长连续匹配次数 results = {} for subsequence in subsequences: results[subsequence] = longest_match(dna_sequence, subsequence) # 在数据库中查找匹配的档案 for person in database: match_count = 0 for subsequence in subsequences: if int(person[subsequence]) == results[subsequence]: match_count += 1 # 所有STR都匹配时才判定为匹配成功 if match_count == len(subsequences): 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()
关键修正说明
- 删除了计算results时冗余的
match变量,避免干扰后续逻辑。 - 遍历每个人员档案时,新增
match_count变量并初始化为0,确保每次检查都是独立计数。 - 将匹配成功的判断移到所有STR遍历完成后,且判断条件改为
match_count == len(subsequences),确保所有STR都匹配才返回结果。 - 在
longest_match函数中新增了start >= sequence_length的判断,避免索引越界(原代码在极端情况下可能出现切片超出序列长度的问题)。
内容的提问来源于stack exchange,提问作者Kaley
相关产品推荐
相关产品推荐

