Python字母成绩转GPA并计算z-score报错求助
问题:字母成绩转GPA后计算Z值报错
需求说明
需要编写Python代码实现:
- 接收用户输入的字母成绩并存入数组
- 将字母成绩转换为对应GPA数值
- 计算成绩的Z-score
现有代码调用Z-score函数时报错,单独测试Z-score函数在整数/浮点数数组上可正常运行。
现有代码
import numpy as np import scipy.stats as stats import pandas as pd def calculate_z_score(arr): mean = np.mean(arr) std_dev = np.std(arr) z_scores = [(s - mean) / std_dev for s in arr] return z_scores #Tested z-score function on self inputted array of integers/floats and it worked both times. def gpa(arr): for i in range(len(arr)): if arr == 'A': return 4.0 elif arr == 'A-': return 3.7 elif arr == 'B+': return 3.3 elif arr == 'B': return 3.0 elif arr == 'B-': return 2.7 elif arr == 'C+': return 2.3 elif arr == 'C': return 2.0 elif arr == 'C-': return 1.7 elif arr == 'D+': return 1.3 elif arr == 'D': return 1.0 elif arr == 'D-': return 0.7 elif arr== 'F': return 0.0 else: return 0.0 num = int(input("How many students took your course? : ")) print ("What was the grade for each student?: ") p=0 convert = [] for i in range(int(num)): p+=1 convert = input(f'Student {p} :') gpa(convert) result = calculate_z_score(convert) print(result) #End of Code
报错信息
Traceback (most recent call last): File "main.py", line 92, in <module> result = calculate_z_score(convert) File "main.py", line 18, in calculate_z_score mean = np.mean(arr) File "<__array_function__ internals>", line 200, in mean File "/home/runner/z-score/venv/lib/python3.10/site-packages/numpy/core/fromnumeric.py", line 3464, in mean return _methods._mean(a, axis=axis, dtype=dtype, File "/home/runner/z-score/venv/lib/python3.10/site-packages/numpy/core/_methods.py", line 181, in _mean ret = umr_sum(arr, axis, dtype, out, keepdims, where=where) numpy.core._exceptions._UFuncNoLoopError: ufunc 'add' did not contain a loop with signature matching types (dtype('<U1'), dtype('<U1')) -> None
错误原因分析
- 输入存储错误:循环中每次将
convert赋值为单个学生的成绩字符串,而非添加到初始空列表,最终convert只是最后一个输入的字符串,并非成绩列表。 - GPA转换未生效:调用
gpa(convert)后未保存转换后的GPA数值,且gpa函数中多余的for i in range(len(arr))循环无意义(函数参数是单个成绩字符串,无需遍历)。 - 类型不匹配:传入
calculate_z_score的是字符串而非数值型GPA列表,numpy无法对字符串计算均值,触发报错。
修正后的代码
import numpy as np def calculate_z_score(arr): mean = np.mean(arr) std_dev = np.std(arr) z_scores = [(s - mean) / std_dev for s in arr] return z_scores # 重构GPA转换函数:用字典映射简化逻辑,兼容输入大小写和空格 def grade_to_gpa(grade): grade_map = { 'A': 4.0, 'A-': 3.7, 'B+': 3.3, 'B': 3.0, 'B-': 2.7, 'C+': 2.3, 'C': 2.0, 'C-': 1.7, 'D+': 1.3, 'D': 1.0, 'D-': 0.7, 'F': 0.0 } return grade_map.get(grade.strip().upper(), 0.0) num = int(input("How many students took your course? : ")) print("What was the grade for each student?: ") # 存储所有学生的GPA数值 gpa_list = [] for p in range(1, num + 1): grade = input(f'Student {p} : ') gpa = grade_to_gpa(grade) gpa_list.append(gpa) # 计算并输出Z-score result = calculate_z_score(gpa_list) print("Z-scores:", result)
修正说明
- 优化GPA转换:用字典替代冗长的if-elif逻辑,同时处理输入的大小写和空格,提升鲁棒性。
- 正确收集数据:循环中逐个转换成绩为GPA并存入数值列表,确保传入Z-score函数的是浮点型数组。
- 简化冗余代码:移除未使用的
scipy和pandas导入,精简逻辑。
内容的提问来源于stack exchange,提问作者0ptimusLime
相关产品推荐
相关产品推荐

