CS50 Pset6 DNA问题:数据库匹配DNA轮廓最后一步求助
CS50 Pset6 DNA 匹配逻辑修正
先梳理你代码里的核心问题,再给出修正方案:
现存问题点
- DNA序列读取错误:你把序列拆成了单个字符的列表,但
longest_match函数需要接收完整的字符串作为参数,这会导致STR匹配完全失效。 - STR计数收集错误:
str_counts = [longest_sequence[subsequence]]只会保留最后一个STR的计数,应该收集所有STR的计数到列表里。 - 数据库匹配逻辑混乱:
- 不需要遍历sequence的长度,应该遍历每个STR的类型,对比对应计数
- 数据库中存储的计数是字符串类型,需要转成整数才能和你的数值型计数比较
database[i][1:][j]这种写法错误,应该通过STR的key去获取数据库中对应的值- 匹配成功后应该输出当前行的
name,而不是database["name"](这会报错,因为database是列表)
修正后的完整代码
import sys import csv def longest_match(sequence, subsequence): # 假设这个函数是你已经实现正确的版本,接收字符串类型的sequence和subsequence 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 end > sequence_length: break if sequence[start:end] == subsequence: count += 1 else: break longest_run = max(longest_run, count) return longest_run # 读取数据库文件 database = [] filename = sys.argv[1] with open(filename) as f: reader = csv.DictReader(f) for row in reader: database.append(row) # 读取DNA序列文件(直接存成字符串,不要拆成字符列表) sequence = "" filename = sys.argv[2] with open(filename) as f: sequence = f.read().strip() # 查找每个STR的最长匹配 subsequences = list(database[0].keys())[1:] longest_sequence = {} for subsequence in subsequences: longest_sequence[subsequence] = longest_match(sequence, subsequence) # 检查数据库匹配 match_found = False for person in database: # 逐个对比每个STR的计数 match = True for subsequence in subsequences: # 把数据库中的字符串转成整数,和计算出的计数比较 if int(person[subsequence]) != longest_sequence[subsequence]: match = False break if match: print(person["name"]) match_found = True break # 如果没有匹配到任何人 if not match_found: print("No match")
关键逻辑解释
- DNA序列读取:直接读取为完整字符串,确保
longest_match能正确处理。 - STR计数收集:
longest_sequence字典存储每个STR对应的最长连续重复次数。 - 匹配逻辑:
- 遍历数据库中的每一个人的数据
- 对每个人,逐个对比所有STR的计数(注意类型转换)
- 如果所有STR计数都匹配,输出名字并终止循环;如果遍历完所有人都没匹配,输出"No match"
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

