我写了一个简单的Python脚本来确定是否报告了所有学生成绩。该脚本首先循环并将学生添加到关于成绩状态的数组中。然后我再次循环浏览文件,以确定每个学生的成绩是否都在。我最终得到三个阵列,其中包括"所有成绩报告","一些成绩报告",& #34;未报告成绩"。但是,我想用更多面向对象的方法来解决这个问题。我试图创建一个有效的类。我坚持如何循环并为每个学生创建一个对象,然后使用addcourse将每个课程推送到Object中。我能成为更好的程序员的任何帮助都会很棒!
数据:
**id,fname,lname,course,grade,mode**
10001,Freddy,Freshman,Art-101,A,online
10001,Freddy,Freshman,Art-101,A,online
10002,Suize,Sophmore,Mat-102,C,inperson
10002,Suize,Sophmore,Bio-101, ,inperson
10002,Suize,Sophmore,Soc-201,D,online
10003,Jilly,Junior,mth-102, ,inperson
10003,Jilly,Junior,Bus-101, ,inperson
10003,Jilly,Junior,Che-204, ,inperson
工作代码:
fh = open('students.txt').readlines()
header = fh.pop(0)
gradereported = []
nogradereported = []
for line in fh:
students = line.split(',')
ids = students[0]
grade = students[4]
if grade != "":
gradereported.append(ids)
else:
nogradereported.append(ids)
allgradesin =[]
nogradesin = []
somegradesin = []
for i in fh:
students = line.split(',')
ids = students[0]
if ids in gradereported and ids not in nogradereported:
if ids not in allgradesin:
allgradesin.append(ids)
elif ids not in gradereported and ids in nogradereported:
if ids not in nogradesin:
nogradesin.append(ids)
elif ids in gradereportedand and ids in nogradereported:
if ids not in somegradesin:
somegradesin.append(ids)
在课堂上尝试:
class Student(object):
def __init__(self, lname, fname, term, courses = []):
self.studid = studid
self.lname = lname
self.fname = fname
self.term = term
self.courses = []
def addcourse(self, course, grade, mode):
self.course = course
self.grade = grade
self.mode = mode
self.courses.append((self.course, self.grade, self.mode))
答案 0 :(得分:1)
你可以这样做,正如@blade建议的那样,通过创建一个由学生ID索引的字典,然后输入文件的每一行,或者从字典中获取现有学生(如果存在)或者创建一个新学生。在代码中,这看起来像:
class Student(object):
def __init__(self, student_id, lname, fname):
self.studid = student_id
self.lname = lname
self.fname = fname
self.courses = []
def addcourse(self, course, grade, mode):
self.courses.append((course, grade, mode))
students = {}
fh = open('students.txt').readlines()
header = fh.pop(0)
for line in fh:
row = line.split(',')
if len(row) < 6:
continue
student_id, fname, lname, course, grade, mode = [i.strip() for i in row]
student = students.get(student_id, Student(student_id, lname, fname))
student.addcourse(course, grade, mode)
students[student_id] = student
有几点需要注意。首先,我修改了Student
类的构造函数,删除了术语参数,因为不清楚输入文件中指定term
的位置。此外,由于您不使用courses
参数,我也放弃了它。 (请注意,您可能不希望使用[]
作为默认参数。请阅读mutable default arguments here。)您也不需要为您的课程,成绩和模式创建实例变量。 addcourse
函数,您可以直接将它们附加到数组中。
我还为strip
添加了对从输入文件中提取的每个项目的调用,以清理每行末尾的换行符。
答案 1 :(得分:0)
这个怎么样:
答案 2 :(得分:0)
除了@JCVanHanne的答案之外,您还可以在班级中定义另一个函数来收集信息,无论学生是否没有,部分或全部成绩。
一种可能的方法(假设缺少的成绩由空字符串表示,同时也可以是 A + 或其他非空值的分数):
def gradeStatus(self):
miss = [course[1] for course in self.courses].count("") # count empty grades
if len(self.courses) == miss:
print('No grades at all')
elif miss in range(1, len(self.courses)):
print('Some, but not all grades')
elif miss == 0:
print('All grades provided')
else:
print('Invalid Data')
您可能会使用状态代码或其他方式(如返回值进一步处理)来处理信息,而不仅仅是打印它们。以打印命令为例:
students['10003'].gradeStatus() # leads to: No grades at all