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

CS50 DNA.py中STR计数与数据库匹配逻辑出错求助

问题分析与修正方案

核心错误点

  • 遍历对象完全错误:你的循环for i in range(1, len(str) - 1)是在遍历STR字段,而非数据库中的人员,完全偏离了「逐个比对每个人STR数据」的目标。
  • 类型不匹配:checked_seq中存储的是整数类型的重复次数,但从CSV读取的names[i-1][str[i]]是字符串类型,直接用==比较永远不会相等。
  • 逻辑流程混乱:while True循环毫无意义,且你会在每次STR比对时就输出结果,导致可能多次打印"No match",而非等所有人员比对完成后再判断是否存在匹配。
  • 索引计算错误:names[i-1]的索引逻辑完全错误,遍历STR索引时,i-1无法对应到正确的人员数据。

修正后的匹配逻辑代码

替换你原有的匹配逻辑代码,以下是正确实现:

# 遍历数据库中的每一个人员
for person in names:
    match_count = 0
    # 遍历每一个STR字段(从索引1开始,跳过第一个"name"列)
    for i in range(1, len(str)):
        str_name = str[i]
        # 将CSV中的字符串转为整数,和checked_seq中的数字比较
        if int(person[str_name]) == checked_seq[i]:
            match_count += 1
        else:
            # 只要有一个STR不匹配,直接跳出当前人员的比对
            break
    # 如果所有STR都匹配(匹配数量等于STR的总数)
    if match_count == len(str) - 1:
        print(person[str[0]])
        exit()  # 找到匹配后直接退出程序
# 所有人员都比对完仍无匹配
print("No match")

额外优化建议

你原有的STR列名读取部分可以合并到数据库读取操作中,避免重复打开文件:

# 合并数据库读取与STR列名获取
names = []
with open(sys.argv[1], "r") as file:
    reader = csv.DictReader(file)
    str = reader.fieldnames  # 直接从DictReader获取列名,无需重新打开文件
    for name in reader:
        names.append(name)

代码改进说明

  1. 正确遍历人员:直接遍历names列表中的每个person字典,对应数据库里的每一行数据。
  2. 类型统一:用int()将CSV中读取的STR次数字符串转为整数,保证与checked_seq中的数字类型一致,才能正确比较。
  3. 提前终止无效比对:只要某一个STR不匹配,就跳出当前人员的比对循环,提升效率。
  4. 匹配判断逻辑正确:当match_count等于STR的总数(len(str)-1,因为第一个列是姓名),说明该人员所有STR都匹配,打印姓名后直接退出程序。
  5. 全局无匹配处理:只有当所有人员都比对完没有匹配时,才打印"No match"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 02:40:31