CS50 DNA匹配问题:字典用==比较为何无匹配结果?
问题原因与解决方法
你的代码返回“No Match”的核心问题是数据类型不匹配:
- 从CSV文件读取的数据库中,STR对应的次数是字符串类型(比如
"AGATC": "5") - 而
longest_match函数返回的是整数类型,你直接存入了match字典(比如"AGATC": 5)
字典用==比较时,会严格检查每个键对应的值的类型和内容,类型不同即使数值一样也会判定不相等,所以你的匹配逻辑永远不会触发。
解决办法(二选一即可)
方法1:读取数据库时转换类型
在处理copy_database的时候,把每个STR的值转换成整数:
for i in range(len(copy_database)): del copy_database[i]["name"] # 新增:把所有STR值转成整数 for k in copy_database[i]: copy_database[i][k] = int(copy_database[i][k])
方法2:存储match时转成字符串
在给match字典赋值时,把整数转成字符串:
match[remove_dup[i]] = str(longest_match(sequence, remove_dup[i]))
额外优化建议
你获取STR列表的方式有点绕,可以直接用csv.DictReader的fieldnames属性来提取,不需要去重(因为数据库里的列是固定的):
# 替换原来的key和remove_dup相关代码 reader = csv.DictReader(d) str_list = [field for field in reader.fieldnames if field != "name"]
这样更简洁,也不会因为set打乱顺序(虽然顺序不影响字典比较,但可读性更好)。
内容的提问来源于stack exchange,提问作者fumitsukai
相关产品推荐
相关产品推荐

