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

CS50 Pset6 DNA匹配程序异常:始终返回No match求助

CS50 Pset6 DNA匹配问题修复方案

问题根源

你的代码存在两个核心问题导致无法匹配到正确人名:

  1. 类型不匹配
    CSV文件中读取的STR重复次数是字符串类型(比如"5"),而longest_match函数返回的是整数类型(比如5),直接用==比较会判定为不相等。

  2. 匹配逻辑错误
    当前嵌套循环只要检测到某一个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:05:01