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

CS50 Pset6 DNA问题:数据库匹配DNA轮廓最后一步求助

CS50 Pset6 DNA 匹配逻辑修正

先梳理你代码里的核心问题,再给出修正方案:

现存问题点

  1. DNA序列读取错误:你把序列拆成了单个字符的列表,但longest_match函数需要接收完整的字符串作为参数,这会导致STR匹配完全失效。
  2. STR计数收集错误:str_counts = [longest_sequence[subsequence]]只会保留最后一个STR的计数,应该收集所有STR的计数到列表里。
  3. 数据库匹配逻辑混乱:
    • 不需要遍历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")

关键逻辑解释

  1. DNA序列读取:直接读取为完整字符串,确保longest_match能正确处理。
  2. STR计数收集:longest_sequence字典存储每个STR对应的最长连续重复次数。
  3. 匹配逻辑:
    • 遍历数据库中的每一个人的数据
    • 对每个人,逐个对比所有STR的计数(注意类型转换)
    • 如果所有STR计数都匹配,输出名字并终止循环;如果遍历完所有人都没匹配,输出"No match"

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:25:39