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)
代码改进说明
- 正确遍历人员:直接遍历
names列表中的每个person字典,对应数据库里的每一行数据。 - 类型统一:用
int()将CSV中读取的STR次数字符串转为整数,保证与checked_seq中的数字类型一致,才能正确比较。 - 提前终止无效比对:只要某一个STR不匹配,就跳出当前人员的比对循环,提升效率。
- 匹配判断逻辑正确:当
match_count等于STR的总数(len(str)-1,因为第一个列是姓名),说明该人员所有STR都匹配,打印姓名后直接退出程序。 - 全局无匹配处理:只有当所有人员都比对完没有匹配时,才打印"No match"。
内容的提问来源于stack exchange,提问作者87lst
相关产品推荐
相关产品推荐

