Python 有没有办法在收集分数之前收集所有的姓名和ID?

Python 有没有办法在收集分数之前收集所有的姓名和ID?,python,dictionary,Python,Dictionary,在获得每个作业的分数之前,我有没有办法收集所有学生的姓名和ID?目前,我的代码一次运行一个学生,但是有没有办法一次调用一个学生的ID来添加他们的分数 nameID = {} while input("Would you like to add a student? ") == "yes": name = input("What is the student's name?: ") ID = input("What is the student's ID?: ") nam

在获得每个作业的分数之前,我有没有办法收集所有学生的姓名和ID?目前,我的代码一次运行一个学生,但是有没有办法一次调用一个学生的ID来添加他们的分数

nameID = {}

while input("Would you like to add a student? ") == "yes":
    name = input("What is the student's name?: ")
    ID = input("What is the student's ID?: ")
    nameID[ID] = name   
    scores = []
    assignments = int(input("How many assignments were given? "))

    for i in range(assignments): 
        score = int(input("Enter {}'s score for assignment {} (0-100): ".format(nameID[ID], i+1)))
        scores.append(score)

    average = (sum(scores))/assignments
    print("{}'s average score was {:.1f}".format(name, average))
    nameID[ID] = {"Name": name, "Scores": scores}

print(nameID)

首先,您需要学习一些关于Python数据类型以及如何应用它们的教程。似乎您正在尝试构建一个学生数据表,包括姓名、ID和每个学生的分数列表

这表明存在一个数据框架——尽管该数据结构可能超出了您在课堂上所学的内容。同时,看起来您正在尝试使用
dict
来完成这项工作——这是合理的。但是,您还没有以Python能够识别的方式设计该结构

我不知道您是否需要通过学生姓名或学生ID访问数据;您发布的代码对关系感到困惑。假设您希望按名称执行此操作,那么可能需要在上层使用嵌套的dict:name,下面是ID和分数

ledger = {}
while input("Would you like to add a student? ") == "yes": 
    name = input("What is the student's name?: ")
    id = input("What is the student's ID?: ")
    ledger[name] = {"ID": id}

assignments = int(input("How many assignments were given? "))

for name in ledger: 
    score_list = []
    for i in range(assignments):
        score = input("Enter {}'s score for assignment {}: ".format(name, i+1))
        score_list.append(int(score))

    ledger[name]["scores"] = {"ID": ID, "scores": scores}

这会让您在某种程度上找到一个整体解决方案吗?

首先,您需要学习一些关于Python数据类型以及如何应用它们的教程。似乎您正在尝试构建一个学生数据表,包括姓名、ID和每个学生的分数列表

这表明存在一个数据框架——尽管该数据结构可能超出了您在课堂上所学的内容。同时,看起来您正在尝试使用
dict
来完成这项工作——这是合理的。但是,您还没有以Python能够识别的方式设计该结构

我不知道您是否需要通过学生姓名或学生ID访问数据;您发布的代码对关系感到困惑。假设您希望按名称执行此操作,那么可能需要在上层使用嵌套的dict:name,下面是ID和分数

ledger = {}
while input("Would you like to add a student? ") == "yes": 
    name = input("What is the student's name?: ")
    id = input("What is the student's ID?: ")
    ledger[name] = {"ID": id}

assignments = int(input("How many assignments were given? "))

for name in ledger: 
    score_list = []
    for i in range(assignments):
        score = input("Enter {}'s score for assignment {}: ".format(name, i+1))
        score_list.append(int(score))

    ledger[name]["scores"] = {"ID": ID, "scores": scores}


这是否会让您在某种程度上找到一个整体解决方案?

我不理解您提出的问题。为什么需要定义包含尚未定义名称的词典?字典没有索引。您正在定义一个
集合,而不是一个
dict
nameID
的集合,所以
nameID[“ID”]
永远不会起作用。如果您只有一个
分数
列表,您建议如何区分每个用户的分数?您将在接下来的几行中替换
名称
id
。请注意
名称[0]
是学生姓名的第一个字母,我不明白你问的问题。为什么需要定义包含尚未定义名称的词典?字典没有索引。您正在定义一个
集合,而不是一个
dict
nameID
的集合,所以
nameID[“ID”]
永远不会起作用。如果您只有一个
分数
列表,您建议如何区分每个用户的分数?您将在接下来的几行中替换
name
id
。请注意,
name[0]
是学生姓名的第一个字母,而不是分数的参考。这比OP的想法要好。但是给定的ID比名字更可能是唯一的,也许
ledger
应该有
ID
键。这就是为什么我给出了“假设”的警告——普通人会知道学生的名字,但不会记住他们的ID。一个“适当”的实现会将其设置为一个具有数据帧、由唯一ID索引、具有按名称查找方法的类。有什么方法可以做到这一点,这样我就可以在添加分数之前添加所有学生?我更新了我的解决方案,以便在一批中最后添加分数。这比OP的想法要好。但是给定的ID比名字更可能是唯一的,也许
ledger
应该有
ID
键。这就是为什么我给出了“假设”的警告——普通人会知道学生的名字,但不会记住他们的ID。一个“适当”的实现会将其设置为一个具有数据帧、由唯一ID索引、具有按名称查找方法的类。有什么方法可以做到这一点,以便我可以在添加分数之前添加所有学生?我更新了我的解决方案,以便在最后一次添加分数,一批。