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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:43:17