Python中defaultdict空值判断逻辑异常及NameError问题排查求助
嘿,咱们一步步拆解并解决你的问题:
第一个问题:空字典时score_count未增加的原因
你第一段代码里,程序确实执行了elif分支(毕竟你看到了Empty的打印),但score_count没增加,大概率是因为default_val和test_data[-1]不相等,而非分支执行异常。
另外可以优化一下空字典的判断逻辑,用更Pythonic的写法替代len(mapp) != 0——空的可迭代对象(包括字典)在布尔判断中会直接返回False,代码会更简洁直观:
# 替换原来的if-elif if mapp: # 字典非空时为True final_class = list(res)[0] else: print("Empty") final_class = default_val
之后你可以检查进入else分支时,default_val和test_data[-1]的取值是否符合预期,就能明白score_count没增加的具体原因。
第二个问题:NameError的解决
你修改代码后改用final_class_1,但这个变量只在elif len(mapp) == 0的分支里定义。当mapp不为空时,程序不会执行这个分支,final_class_1就成了未定义的变量,最后一行判断自然会报错。
解决方法很简单:始终使用同一个变量名,就像你第一段代码那样用final_class,确保不管进入哪个分支,这个变量都会被赋值,这样就不会出现未定义的问题。
优化后的完整代码
from collections import defaultdict mapp = defaultdict(list) for i in match_gp[test_data]: mapp[i[-2]].append(float(i[-1])) res = {k: sum(v) for k, v in mapp.items()} res = dict(sorted(res.items(), key=lambda item: item[1], reverse=True)) # 简洁判断字典是否为空 if mapp: final_class = list(res)[0] else: print("Empty") final_class = default_val # 此时final_class一定已定义,不会报错 if final_class == test_data[-1]: score_count += 1
补充说明:当mapp非空时,res必然也非空,所以list(res)[0]不会触发索引越界错误,这部分逻辑是安全的。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

