Skip to main content
 首页 » 编程设计

Python:如何检查对象键值对的数据类型

2025年05月04日32fff_TT

我正在创建一个函数来将每个数组(作业、测验、测试)的标记添加到一个对象(student1)中。当代码尝试添加“Lloyd”时,肯定会出现错误。 我想检查“name”的值的数据类型,只有的值才进行算术运算>key 是数字。请建议。

student1 = { 
    "name": "Lloyd", 
    "homework": [90, 97, 75, 92], 
    "quiz": [88, 40, 94], 
    "test": [75, 90] 
}     
 
def eachSubjAverage(std):              
    for item in std:                         
        total = sum(std[item])   #totalling each marks 
        std[item].append(total)      
 
        average_no = total/(len(std[item])-1) #averaging the marks 
        std[item].append(average_no)  
 
eachSubjAverage(student1) 

请您参考如下方法:

XY problem 的一个明显案例...

您真正的问题是错误的数据结构以相同的方式存储异构信息(学生的姓名及其分数)。 RightSolution(tm) 是使用更好的数据结构,即:

student1 = { 
    "personal_infos" : { 
        "name": "Lloyd", 
    }, 
    "marks": { 
        "homework": [90, 97, 75, 92], 
        "quiz": [88, 40, 94], 
        "test": [75, 90] 
    }, 
    "totals": {} 
    "averages": {} 
  } 

一旦你有了这个,你就不必测试你是否有一个字符串或数字作为值:

def eachSubjAverage(student):              
    for subject, marks in student["marks"].items():                         
        total = sum(marks)   #totalling each marks 
        student["totals"][subject] = total      
        average = total / (len(marks)) 
        student["averages"][subject] = average 

请注意,您可以以不同方式布局数据,即按主题布局:

student1 = { 
    "personal_infos" : { 
        "name": "Lloyd", 
    }, 
    "subjects": { 
        "homework": { 
            "marks" : [90, 97, 75, 92], 
            "total" : None, 
            "average" : None 
            },  
        "quiz": { 
            "marks" : [88, 40, 94], 
            "total" : None, 
            "average" : None 
            },  
        "test": { 
            "marks" : [75, 90], 
            "total" : None, 
            "average" : None 
            },  
        }, 
 } 
 
 
def eachSubjAverage(student):              
    for subject, data in student["subjects"].items():                         
        total = sum(data["marks"])   #totalling each marks 
        data["total"] = total      
        average = total / (len(data["marks"])) 
        data["average"] = average 

请注意,如果您没有修复数据结构(外部数据或其他)的选项,您仍然不想依赖类型检查(充其量是脆弱的) - 你想测试 key 本身,通过将主题名称列入白名单或将“非主题”名称列入黑名单,即:

# blacklist non-subjects 
NON_SUBJECTS = ("name",) 
 
def your_func(student): 
    for key, value in student.items(): 
        if key in NON_SUBJECTS: 
            continue 
        compute_stuff_here() 

哦,是的:在分数列表中添加总分和平均值也是搬起石头砸自己脚的好方法 - 一旦完成,您无法判断最后两个“分数”是分数还是(总分,平均值)。