0

所以我的目标是获取三个字典,并以这种格式打印出来:

姓名:《姓名》

作业:“列表的平均值”

测验:“列表的平均值”

测试:“列表的平均值”

我的列表中包含 3 个字典,但我无法深入挖掘。我在这里一步一步地尝试。

所以查看这段代码后:

lloyd = {
    "name": "Lloyd",
    "homework": [90.0, 97.0, 75.0, 92.0],
    "quizzes": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
}
alice = {
    "name": "Alice",
    "homework": [100.0, 92.0, 98.0, 100.0],
    "quizzes": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
}
tyler = {
    "name": "Tyler",
    "homework": [0.0, 87.0, 75.0, 22.0],
    "quizzes": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]
}

students = [lloyd,alice,tyler]

def compute_grades(ourstudents):
    for student in ourstudents:
        print "Name: " + student["name"]
        print "Homework: ", sum(student["homework"]) / len(student["homework"])
        print "Quizzes: ", sum(student["quizzes"]) / len(student["quizzes"])
        print "Tests: ", sum(student["tests"]) / len(student["tests"])

compute_grades(students)

有没有办法我可以做一个基本的检查,所以这适用于任何字典?

例如...

  1. 键定义是字符串吗?如果有,请打印出来!
  2. 键定义是列表吗?如果是这样,请运行此平均函数并打印结果。

我基本上只是想最小化其中的硬编码并提出一个更优雅的解决方案。任何帮助表示赞赏!

4

4 回答 4

3

你可以做这样的事情,但是根本没有错误检查或密钥排序:

lloyd = {
    "name": "Lloyd",
    "homework": [90.0, 97.0, 75.0, 92.0],
    "quizzes": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
}
alice = {
    "name": "Alice",
    "homework": [100.0, 92.0, 98.0, 100.0],
    "quizzes": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
}
tyler = {
    "name": "Tyler",
    "homework": [0.0, 87.0, 75.0, 22.0],
    "quizzes": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]
}

students = [lloyd,alice,tyler]

def average(data):
    return sum(data) / float(len(data))

def compute_grades(students):
    for student in students:
        print('-'*23)
        for key, value in student.items():
            if isinstance(value, str):
                formatted_value = value
            else:
                formatted_value = average(value)
            print("%s: %s" % (key.title(), formatted_value))

compute_grades(students)
于 2013-09-07T17:49:25.817 回答
0

这似乎完美无缺:

lloyd = {
    "name": "Lloyd",
    "performance": [16.0, 19.0, 25.0, 14.4, 24.5, 16.2],
    "homework": [90.0, 97.0, 75.0, 92.0],
    "quizzes": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
}
alice = {
    "name": "Alice",
    "extra_credit": "OVER 9000!!!!",
    "research": [16, 24, 56, 78, 23],
    "missed_days": [1, 1, 2, 1],
    "homework": [100.0, 92.0, 98.0, 100.0],
    "quizzes": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
}
tyler = {
    "name": "Tyler",
    "homework": [0.0, 87.0, 75.0, 22.0],
    "quizzes": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]
}

students = [lloyd,alice,tyler]
def average(data):
    return sum(data) / float(len(data))
def compute_grades(ourstudents):
    for student in ourstudents:
        print "-" * 15
        print student["name"]
        for field, value in student.items():
            try:
                average=sum(value)/float(len(value))
                print "{0}: {1}".format(field.title(), average)
            except TypeError:
                pass
compute_grades(students)

基于@Kurtis 输入并使用随机额外信息进行测试

于 2013-09-07T18:23:22.017 回答
0

您可以将其包装在 try catch 块中

def compute_grades(ourstudents):
    for student in ourstudents:
        for field, value in student.items():
            try:
                average=sum(value)/float(len(value))
                print "{0}: {1}".format(field.title(), average)
            except TypeError:
                print "{0}: {1}".format(field.title(), value)
于 2013-09-07T17:51:48.200 回答
-1

这似乎完美无缺:

lloyd = {
    "name": "Lloyd",
    "performance": [16.0, 19.0, 25.0, 14.4, 24.5, 16.2],
    "homework": [90.0, 97.0, 75.0, 92.0],
    "quizzes": [88.0, 40.0, 94.0],
    "tests": [75.0, 90.0]
}
alice = {
    "name": "Alice",
    "extra_credit": "OVER 9000!!!!",
    "research": [16, 24, 56, 78, 23],
    "missed_days": [1, 1, 2, 1],
    "homework": [100.0, 92.0, 98.0, 100.0],
    "quizzes": [82.0, 83.0, 91.0],
    "tests": [89.0, 97.0]
}
tyler = {
    "name": "Tyler",
    "homework": [0.0, 87.0, 75.0, 22.0],
    "quizzes": [0.0, 75.0, 78.0],
    "tests": [100.0, 100.0]
}

students = [lloyd,alice,tyler]
def average(data):
    return sum(data) / float(len(data))
def compute_grades(students):
    for student in students:
        print "-" * 15
        print student["name"]
        for key in student.keys():
            if isinstance(student[key], str):
                key_value = student[key]
            else:
                key_value = average(student[key])
            if key != "name":
                print("%s: %s" % (key.title(), key_value))
compute_grades(students)

基于@septi 输入并使用随机额外信息进行测试

于 2013-09-07T18:11:43.090 回答