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

CS50 Week6 DNA识别程序匹配错误,寻求技术帮助

CS50 Week6 DNA识别程序匹配异常修复

你的代码存在三个核心逻辑错误,导致匹配结果异常:

错误点分析

  1. 冗余且干扰的match变量
    在计算STR最长匹配序列的循环中,你定义的match变量完全没有实际作用,反而会在后续的匹配检查中残留初始值,干扰判断逻辑。

  2. 未重置匹配计数器
    遍历每个人员档案时,没有在每次循环开始时将匹配计数器重置为0,导致计数器会累加前一个人员的匹配次数,引发错误匹配。

  3. 匹配成功的判断条件错误
    你用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 00:43:26