Python 3.6:如何基于列表与insert方法构建指定功能函数
完善Python交互列表功能:按姓名/分数插入+计算平均分
嗨,我来帮你梳理并完善这个功能!咱们先拆解原代码里的几个小问题,再一步步实现你想要的交互效果:
原代码里的核心问题
avg函数错误地将输入列表X重置为空,导致根本无法计算平均分main_function里有变量名拼写错误(qurstion→question)- 缺少循环输入多个成员的逻辑,也没实现按姓名/分数排序插入的核心需求
- 没有触发计算平均分的入口逻辑
修正后的完整代码
def insert_member(n, X, sort_by): # 按姓名或分数排序插入新成员 if sort_by == 'n': # 按姓名首字母升序插入(不区分大小写) for i in range(len(X)): if n[0].lower() < X[i][0].lower(): X.insert(i, n) return X X.append(n) elif sort_by == 'm': # 按分数升序插入(若要降序可将<改为>) for i in range(len(X)): if n[1] < X[i][1]: X.insert(i, n) return X X.append(n) return X def avg(X): # 计算列表中所有成员的平均分 if not X: # 处理空列表情况,避免除以零错误 return 0.0 marks = [member[1] for member in X] # 提取所有分数 average = sum(marks) / len(marks) return average def main_function(): X = [] sort_type = None # 记录用户选择的排序方式('n'或'm') while True: if not sort_type: # 初始选择:开始新列表或退出 question = input("\nPress 's' to start with new list or 'q' to quit: ").lower() if question == 'q': print("Exiting program...") break elif question == 's': # 选择排序方式并验证输入有效性 sort_type = input("\nInsert members into list by name ('n') or by marks ('m'): ").lower() while sort_type not in ['n', 'm']: sort_type = input("Invalid input! Please enter 'n' for name or 'm' for marks: ").lower() print("Enter name and marks, type 'AVERAGE' when done.") else: print("Invalid input! Please enter 's' or 'q'.") else: # 循环输入成员信息,直到输入'AVERAGE'触发计算 name_input = input("Name: ").strip() if name_input.upper() == 'AVERAGE': # 输出所有成员信息和平均分 print("\n--- Average Calculation ---") for member in X: print(f"{member[0]} has a mark of: {member[1]}") average_score = avg(X) print(f"Average: {average_score:.1f}") # 重置状态,允许重新开始或退出 X = [] sort_type = None else: # 处理分数输入,确保是整数 try: marks_input = int(input("Marks: ").strip()) new_member = [name_input.title(), marks_input] X = insert_member(new_member, X, sort_type) print(f"X: {X}") except ValueError: print("Invalid marks! Please enter a number.") if __name__ == "__main__": main_function()
功能说明与测试效果
- 排序插入:选择
'n'时按姓名首字母升序插入,选择'm'时按分数升序插入(可自行修改为降序) - 交互流程:从初始选择→排序方式→循环输入成员→触发平均分计算→回到初始状态,形成完整闭环
- 输入验证:对排序方式、分数输入做了有效性校验,避免程序崩溃
测试你的期望场景,输出如下:
Press 's' to start with new list or 'q' to quit: s Insert members into list by name ('n') or by marks ('m'): n Enter name and marks, type 'AVERAGE' when done. Name: samantha Marks: 45 X: [['Samantha', 45]] Name: billy Marks: 30 X: [['Billy', 30], ['Samantha', 45]] Name: rudy Marks: 75 X: [['Billy', 30], ['Rudy', 75], ['Samantha', 45]] Name: AVERAGE --- Average Calculation --- Billy has a mark of: 30 Rudy has a mark of: 75 Samantha has a mark of: 45 Average: 50.0
内容的提问来源于stack exchange,提问作者Jefford M
相关产品推荐
相关产品推荐

