【问题标题】:Python - Person object with expanding listPython - 具有扩展列表的人员对象
【发布时间】:2015-12-15 07:03:21
【问题描述】:

我正在研究 Python 中的类和 OOP 结构,试图解决以下问题:

给定一个文本文件的形式:

Name: [someName]        Course: [someCourse]
Name: [someName]        Course: [someCourse]
...

包含一名学生的 [NAME] 和该学生参加的 [COURSE] 学生。我们假设没有两个学生有相同的名字,因此:

Name: Anderson      Course: Biology
Name: Peter         Course: History
Name: Anderson      Course: Mathematics

表示安德森同时学习生物学和数学。

问题

  • 读取输入文件
  • 提取学生姓名和课程
  • 打印出特定学生所学课程的摘要

例如,基于上面示例文件的结果,应该 生成:

Student: Anderson
Courses: Biology
         Mathematics

Student: Peter
Courses: History

我目前所拥有的

我已经能够阅读该文件并提取有关姓名和课程的信息。我已将这些值添加到两个列表(数组)中,student_namestudent_course。从上面的示例文本文件中,这将产生以下列表:

student_name = ["Anderson", "Peter", "Anderson"]
student_course = ["Biology", "History", "Mathematics"]

表示索引对应。也就是说,位于 student_name[i] 的学生参加位于 student_course[i] 的课程。

我还有一个结构如下的 Student 类:

class Student(object):
    #Variables here
    student_list = [] #empty list of students

    def __init__(self, name, course):
        self.name = name
        self.course = course

    def check_student(self, name, course):
        """ 
            Checks if student (given by name) is already in student list.
            Function already_exists() works! 
        """
        if(self.already_exists(self.name) == false): #If not in list
            self.student_list.append(self.name) #Add student to list
            ##### NEED help HERE ####
            #Add course to already existing Student. 
        else:
            ##### NEED help HERE ####
            #Create student + add course. 

这个想法是遍历 student_namestudent_course 列表,以更新学生信息。也就是说,如果遇到新名称:将其添加到 student_list,并记下课程。相反,如果名称已经存在:只需将课程添加到学生。

问题

对于如何将课程添加到现有学生对象或完全创建新学生的任何帮助,我们将不胜感激。

【问题讨论】:

    标签: python list function class oop


    【解决方案1】:

    我认为最好有一个单独的“学生”类,而不是在 Student 类上使用 student_list。

    Student 类可以维护学生姓名到 Student 实例的映射。

    然后,每个单独的 Student 实例可以单独负责维护其课程名称列表。

    根据所需的输出顺序,您可能还希望在 Student 类上维护一组 Student 实例。然而,地图仍然有助于有效地查找给定学生姓名的 Student 实例

    【讨论】:

    • Student 类可以维护学生名称到 Student 实例的映射。 在这种情况下,为什么不只制作 1 个单独的 dict 并省略 Student 类
    • 问题的措辞方式,我怀疑他们想按照名称出现在输入中的顺序输出。因此,按添加顺序排列学生数组将使生成最终输出更容易。也就是说,将学生作为一个班级可能有点过头了,除非你想处理多组学生
    • 谢谢。然而,我的字典在提供两个列表时似乎忽略了一对元素。我有列表: student_name = ["Anderson", "Peter", "Anderson", "Bastian"] course_list = ["Biology", "History", "Maths", "History] ​​使用 for 循环并分配my_dict[student_names[i]] = course_list[i],最终结果忽略了这对(Anderson/Biology)。这是为什么呢?
    • 字典是键和值之间的映射。在字典中,每个键都是唯一的,因此当您第二次将值“Maths”分配给键“Anderson”时,您将覆盖“Biology”的第一个值。这就是为什么您的键应该是学生姓名,而值应该是学生的实例。学生应该是一个由名称和课程列表组成的类。然后,在迭代名称和课程列表时不要分配值,如果它不存在,您应该创建一个实例,否则添加到 Student 的现有实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2019-04-23
    • 2018-06-28
    相关资源
    最近更新 更多