CS50 pset6 DNA项目中如何判断字典是另一字典的子集
错误原因分析
TypeError: unhashable type: 'dict'报错原因:Python字典的in操作符默认检查的是键是否存在,而字典本身属于不可哈希类型,不能作为另一个字典的键,因此直接写seq_master_list in row必然触发报错。- 改
items()后无输出的原因:seq_master_list.items()返回的是当前字典所有键值对的集合,row.items()是人员条目所有键值对的集合,用in是判断前者整个集合是不是后者的单个元素,显然不成立,因为后者的每个元素都是单个(键,值)元组,自然匹配不到结果。
正确实现逻辑
你需要的匹配规则是:seq_master_list里的所有STR键对应的计数,和当前人员条目里对应STR的计数完全相等,忽略人员条目里的name字段即可,有两种常用实现方案:
方案1:遍历STR键逐一比对
for row in dna: is_match = True for str_key, count in seq_master_list.items(): # 只要有一个STR计数不匹配就终止检查 if row.get(str_key) != count: is_match = False break if is_match: # 输出匹配到的人名 print(row['name']) break
方案2:字典子集比对(写法更简洁)
先把人员条目里的name字段移除,得到仅含STR计数的字典,直接和seq_master_list判等即可:
for row in dna: # 提取当前条目中所有STR计数字段 row_str_count = {k:v for k,v in row.items() if k != 'name'} if row_str_count == seq_master_list: print(row['name']) break
注意事项
如果按上述方案还是匹配不到,大概率是数据类型不一致导致:csv读取的所有值默认都是字符串类型,如果你统计得到的seq_master_list里的计数值是整数类型,需要统一两边的类型后再比对。
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

