Python实现按成绩筛选学生的select_students函数问题求助
编程练习题:实现
select_students函数 要求实现名为select_students的函数,参数如下:
- 一个列表,每个元素为包含学生姓名和成绩的子列表
- 成绩阈值,学生成绩大于等于该阈值则被收录
函数需返回一个包含两个条目的字典:
Accepted:按成绩降序排列的收录学生列表Refused:按成绩升序排列的未收录学生列表
用户编写的代码无法正常运行,不清楚如何实现列表转字典并按需追加元素,代码如下:
def select_students(student, threshold): entries = {"Accepted" : "", "Refused" : ""} for x in student: if x[1] <= threshold: entries["Refused"] = "x" else: entries["Accepted"] = "x" if __name__ == '__main__': a = [['Kermit Wade', 27], ['Hattie Schleusner', 67], ['Ben Ball', 5], ['William Lee', 2]] print(select_students(a, 20))
期望输出:
{'Accepted': [['Hattie Schleusner', 67], ['Kermit Wade', 27]], 'Refused': [['William Lee', 2], ['Ben Ball', 5]]}
问题分析与修正代码
原代码的核心问题
- 字典初始值错误:
Accepted和Refused需要是空列表而非空字符串,否则无法追加元素 - 赋值逻辑错误:直接覆盖字典值而非用
append()添加数据,还错误地把字符串"x"赋值,而非变量x - 缺少排序逻辑:没有对最终列表按要求排序
- 函数无返回值:未返回构建好的字典
修正后的代码
def select_students(student_list, threshold): # 初始化空列表存储结果 entries = {"Accepted": [], "Refused": []} # 遍历学生列表,分类添加到对应列表 for student in student_list: if student[1] >= threshold: entries["Accepted"].append(student) else: entries["Refused"].append(student) # 对Accepted列表按成绩降序排序 entries["Accepted"].sort(key=lambda s: s[1], reverse=True) # 对Refused列表按成绩升序排序 entries["Refused"].sort(key=lambda s: s[1]) return entries if __name__ == '__main__': students = [['Kermit Wade', 27], ['Hattie Schleusner', 67], ['Ben Ball', 5], ['William Lee', 2]] print(select_students(students, 20))
代码说明
- 初始字典的两个键对应空列表,方便用
append()添加完整的学生子列表 - 遍历过程中根据成绩阈值判断学生归属,将数据追加到对应列表
- 使用
sort()结合lambda表达式,按成绩对列表排序:reverse=True实现降序,默认参数实现升序 - 函数返回构建完成的字典,确保调用时能获取结果
内容的提问来源于stack exchange,提问作者Pondo
相关产品推荐
相关产品推荐

