You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理学生分数时遍历字典触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:52:39