处理学生分数时遍历字典触发KeyError错误,求解决建议
解决字典KeyError错误及代码逻辑优化
问题背景
我有一个text.txt文件,内容如下:
Oscar Morera 90 Maria Esquivel 95 Lucia Benavides 80 Javier Miranda 85 Alonso Gonzalez 75
尝试运行以下代码复制并求和第三列的分数时,遇到了字典KeyError错误:
data = { } points = 0 f = open("text.txt") lines=f.readlines() f.close() for i in range(len(lines)): # 处理每行内容 line = lines[i] # 拆分列 columns = line.split() # 拼接学生键:名+姓+分数 student = columns[0] + columns[1] + columns[2] # 转换分数为浮点数 points = float(columns[2]) # 累加分数到字典 data[student] += points for student in sorted(data.keys()): print(student,'\t', data[student])
错误信息:
Traceback (most recent call last): File "C:\Users\Admin\Desktop\Test3.py", line 17, in <module> data[student] += points KeyError: 'OscarMorera90'
我推测错误出在data[student] += points这一行,但不知道如何解决,恳请给出建议。
错误原因及解决方法
1. 直接引发KeyError的原因
data[student] += points等价于data[student] = data[student] + points。第一次循环时字典data是空的,不存在'OscarMorera90'这个键,读取不存在的键就会抛出KeyError。
2. 核心逻辑错误(必须修正)
你把分数也拼进了学生的键中,这会导致每个条目都是唯一键——哪怕是同一个学生多次出现,只要分数不同键就不同,根本无法实现分数求和的需求。正确的键应该是学生的姓名(名+姓),不能包含分数。
3. 修正后的代码方案
方案一:用字典get方法处理初始值
data = {} f = open("text.txt") lines = f.readlines() f.close() for line in lines: columns = line.split() # 仅用名+姓作为键,确保同一学生的分数能累加 student = f"{columns[0]} {columns[1]}" # 用空格分隔更易读 points = float(columns[2]) # 若键不存在,默认值为0,再加上当前分数 data[student] = data.get(student, 0) + points for student in sorted(data.keys()): print(student, '\t', data[student])
方案二:用collections.defaultdict简化代码
from collections import defaultdict data = defaultdict(float) f = open("text.txt") lines = f.readlines() f.close() for line in lines: columns = line.split() student = f"{columns[0]} {columns[1]}" points = float(columns[2]) # defaultdict会自动为不存在的键初始化0.0,直接累加即可 data[student] += points for student in sorted(data.keys()): print(student, '\t', data[student])
方案三:手动判断键是否存在
data = {} f = open("text.txt") lines = f.readlines() f.close() for line in lines: columns = line.split() student = f"{columns[0]} {columns[1]}" points = float(columns[2]) if student in data: data[student] += points else: data[student] = points for student in sorted(data.keys()): print(student, '\t', data[student])
4. 额外优化建议
使用with语句自动管理文件关闭,避免忘记关闭文件的问题:
from collections import defaultdict data = defaultdict(float) # with语句会在代码块结束后自动关闭文件 with open("text.txt") as f: for line in f: columns = line.split() student = f"{columns[0]} {columns[1]}" points = float(columns[2]) data[student] += points for student in sorted(data.keys()): print(student, '\t', data[student])
内容的提问来源于stack exchange,提问作者Oscar Morera
相关产品推荐
相关产品推荐

