如何实现函数读取文本文件、重排姓名并计算分数平均值?
问题需求与代码问题
我需要编写函数实现以下功能:从文本文件中读取信息,提取姓名及其对应的分数,计算分数的平均值,并将结果以有序列表形式输出。目前我写了部分代码,但把文件对象传入计算平均值的函数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}")
关键修改说明
- 文件操作优化:使用
with语句自动管理文件的打开与关闭,避免手动close的冗余和遗漏。 - 数据解析逻辑:拆分每行内容后,精准提取姓名(前两个字段)和分数(剩余字段转整数),同时直接计算平均分。
- 排序功能实现:通过
sorted函数结合匿名函数,按姓名字符串排序,替代原空实现的order_nam函数。 - 边界处理:跳过文件中的空行,处理分数为空的情况(避免除以0错误)。
- 输出格式:用
enumerate生成有序列表的序号,平均分保留两位小数,输出更清晰规范。
内容的提问来源于stack exchange,提问作者Murch
相关产品推荐
相关产品推荐

