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

mad*_*hur 1 python types arithmetic-expressions object

我正在创建一个函数来在对象(student1)中添加每个数组(作业,测验,测试)的标记.当代码试图添加"Lloyd"时肯定会出现错误.我要检查的数据类型的"名",以进行算术运算仅当的的关键是数量.请建议.

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)
Run Code Online (Sandbox Code Playgroud)

bru*_*ers 6

一个明显的XY问题案例......

你真正的问题是一个错误的数据结构,以同样的方式存储异质信息(学生的名字和它的标记).RightSolution(tm)是使用更好的数据结构,即:

student1 = {
    "personal_infos" : {
        "name": "Lloyd",
    },
    "marks": {
        "homework": [90, 97, 75, 92],
        "quiz": [88, 40, 94],
        "test": [75, 90]
    },
    "totals": {}
    "averages": {}
  }
Run Code Online (Sandbox Code Playgroud)

}

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

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

请注意,如果您没有选项来修复数据结构(外部数据或其他),您仍然不希望依赖类型检查(最好是脆弱的) - 您想要测试密钥本身,通过将主题名称列入白名单或将"非主题"名称列入黑名单,即:

# 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()
Run Code Online (Sandbox Code Playgroud)

哦,是的:在标记列表中添加总数和平均值也是一种很好的方式来拍摄自己的脚 - 一旦完成,你不能告诉最后两个"标记"是标记还是(总计,平均值).