Python如何从存储类对象的列表中按姓氏删除指定学生条目
Python课程花名册删除学生功能实现
代码修改说明
你当前的drop_student方法参数命名有歧义,实际调用时传入的是姓氏字符串而非Student对象,先调整参数名再做匹配删除即可,以下是两种可行的实现方案:
方案1:通过索引删除(匹配你的需求)
先遍历找到所有姓氏匹配的学生索引,倒序删除避免正序删除导致的索引偏移问题:
def drop_student(self, last_name): # 倒序遍历索引,避免删除元素后索引偏移漏检 for i in range(len(self.roster)-1, -1, -1): if self.roster[i].get_last() == last_name: self.roster.pop(i)
方案2:列表推导式重写花名册(写法更简洁)
直接生成排除目标姓氏学生的新列表赋值给roster,适合不需要保留原列表内存地址的场景:
def drop_student(self, last_name): self.roster = [student for student in self.roster if student.get_last() != last_name]
相关问题解答
- 为什么不能直接用
remove()?remove()需要传入完全匹配的Student对象,你传入的是字符串类型的姓氏,类型不匹配无法直接生效 - 为什么
delattr没用?delattr是用于删除对象的属性,不是删除列表中的元素,和你的需求场景不匹配 - 可以通过删除索引的方式移除学生,方案1就是用的
pop()传入匹配索引的实现逻辑
完整可运行代码
class Student: def __init__(self, first, last, gpa): self.first = first # first name self.last = last # last name self.gpa = gpa # grade point average def get_gpa(self): return self.gpa def get_last(self): return self.last def to_string(self): return self.first + ' ' + self.last + ' (GPA: ' + str(self.gpa) + ')' class Course: def __init__(self): self.roster = [] # list of Student objects def drop_student(self, last_name): # 倒序遍历索引,避免删除元素后索引偏移漏检 for i in range(len(self.roster)-1, -1, -1): if self.roster[i].get_last() == last_name: self.roster.pop(i) def add_student(self, student): self.roster.append(student) def count_students(self): return len(self.roster) if __name__ == "__main__": course = Course() course.add_student(Student('Henry', 'Nguyen', 3.5)) course.add_student(Student('Brenda', 'Stern', 2.0)) course.add_student(Student('Lynda', 'Robinson', 3.2)) course.add_student(Student('Sonya', 'King', 3.9)) print('Course size:', course.count_students(),'students') course.drop_student('Stern') print('Course size after drop:', course.count_students(),'students')
运行后输出:
Course size: 4 students Course size after drop: 3 students
内容的提问来源于stack exchange,提问作者kr003
相关产品推荐
相关产品推荐

