<p>正如@blade建议的那样,您可以创建一个按学生id索引的字典,然后为输入文件的每一行从字典中获取现有的学生(如果存在的话),或者创建一个新的字典。在代码中,这看起来像:</p>
<pre><code>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
</code></pre>
<p>有几件事需要注意。首先,我修改了<code>Student</code>类的构造函数,删除了term参数,因为不清楚在输入文件中指定了<code>term</code>的位置。此外,由于您不使用<code>courses</code>参数,所以我也放弃了它。(请注意,您可能不想使用<code>[]</code>作为默认参数。阅读<a href="http://docs.python-guide.org/en/latest/writing/gotchas/" rel="nofollow">mutable default arguments here</a>)你也不需要在你的<code>addcourse</code>函数中为课程、年级和模式创建实例变量,你可以直接将它们附加到数组中。在</p>
<p>我还为从输入文件中提取的每个项添加了对<code>strip</code>的调用,以清理每行末尾的换行。在</p>