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

如何实现函数读取文本文件、重排姓名并计算分数平均值?

问题需求与代码问题

我需要编写函数实现以下功能:从文本文件中读取信息,提取姓名及其对应的分数,计算分数的平均值,并将结果以有序列表形式输出。目前我写了部分代码,但把文件对象传入计算平均值的函数avg_1时出现错误,希望调整现有函数,实现姓名重排和分数平均值计算。

现有代码如下:

t = open('sample-1.txt','r')

line = t.readlines()
count=0

for i in line:
    count += 1
    print(i.strip())

t.close()

print('\nNew list with added name: ')
t2 = open('sample-1.txt','a')
t2.writelines("\nAaron Woods 1122 123 324 45 88 1561 9 18")
t2.close()

t3=open('sample-1.txt','r')
line2=t3.readlines()
count2 = 0 

for j in line2:
    count2+=1
    print(j.strip())
t3.close()

t4= open('sample-1.txt','r')

def order_nam (str_1,str_2):
    count3=0

def avg_1(num_avg): 
    count4=0
    for k in range(len(2)): # 想忽略姓名只取数字,但逻辑不对
        count4+=1
    return count4

new_avg= avg_1(t4) # 想把文件对象传给avg_1,但实现错误
nam_list=[]

print(new_avg)
重构后的实现方案

原代码的核心问题在于:直接传递文件对象给avg_1却未正确解析内容,avg_1和order_nam均无有效逻辑,且文件操作冗余。以下是完整的修正实现:

完整代码

def parse_student_data(file_path):
    # 读取文件并解析学生的姓名与分数,同时计算平均分
    students = []
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if not line:
                continue  # 跳过空行
            parts = line.split()
            # 前两个元素拼接为姓名,剩余元素转为整数分数
            full_name = f"{parts[0]} {parts[1]}"
            scores = list(map(int, parts[2:]))
            # 计算平均分,处理分数为空的边界情况
            avg_score = sum(scores) / len(scores) if scores else 0.0
            students.append({
                'name': full_name,
                'average': avg_score
            })
    return students

def sort_students_by_name(students):
    # 按姓名拼音/字母顺序排序
    return sorted(students, key=lambda x: x['name'])

# 主执行逻辑
# 追加新学生数据到文件
with open('sample-1.txt', 'a', encoding='utf-8') as f:
    f.write("\nAaron Woods 1122 123 324 45 88 1561 9 18")

# 解析数据并排序
student_records = parse_student_data('sample-1.txt')
sorted_records = sort_students_by_name(student_records)

# 以有序列表形式输出结果
print("按姓名排序的学生平均分结果:")
for index, record in enumerate(sorted_records, start=1):
    print(f"{index}. {record['name']} - 平均分: {record['average']:.2f}")

关键修改说明

  1. 文件操作优化:使用with语句自动管理文件的打开与关闭,避免手动close的冗余和遗漏。
  2. 数据解析逻辑:拆分每行内容后,精准提取姓名(前两个字段)和分数(剩余字段转整数),同时直接计算平均分。
  3. 排序功能实现:通过sorted函数结合匿名函数,按姓名字符串排序,替代原空实现的order_nam函数。
  4. 边界处理:跳过文件中的空行,处理分数为空的情况(避免除以0错误)。
  5. 输出格式:用enumerate生成有序列表的序号,平均分保留两位小数,输出更清晰规范。

内容的提问来源于stack exchange,提问作者Murch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:55:33