You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

列表推导式失效原因咨询及物理课学生成绩处理问题说明

解决物理课学生第二低成绩筛选的列表推导式问题

嘿Justin!我猜你大概率是在列表推导式的逻辑或者数据处理细节上踩坑了——毕竟处理成绩这类带数值+字符串的嵌套列表,很容易忽略一些关键细节。我来帮你梳理问题,给出能正常运行的代码方案,顺便把常见的坑点给你指出来。

核心需求回顾

  • 读取n个学生的姓名+成绩,存储为嵌套列表
  • 找出所有第二低成绩的学生
  • 若有多名学生,按姓名字母顺序排序后每行输出一个

常见的列表推导式错误原因

你写的列表推导式跑不起来,大概率是这几个问题中的一个:

  • 没把成绩转换为数值类型(比如还是字符串),导致排序逻辑完全错误
  • 没对成绩去重,导致找不到真正的第二低成绩(比如最低分重复多次,取索引1还是最低分)
  • 筛选学生的列表推导式条件写错,或者忘记对最终的姓名列表排序

完整可运行的代码方案(含列表推导式)

# 读取学生人数
n = int(input())

# 用列表推导式读取并处理学生数据:把成绩转成float类型(关键!)
students = [[name, float(score)] for name, score in (input().split() for _ in range(n))]

# 提取所有成绩,去重后排序,拿到第二低成绩
unique_sorted_scores = sorted({score for _, score in students})
second_lowest_score = unique_sorted_scores[1]

# 用列表推导式筛选出所有成绩等于第二低的学生姓名
target_names = [name for name, score in students if score == second_lowest_score]

# 按字母顺序排序后逐行输出
for name in sorted(target_names):
    print(name)

关键细节解释

  1. 成绩转数值类型:
    输入的成绩默认是字符串,直接排序会按字符顺序(比如"8"会排在"75"前面),所以必须用float(score)转换,这是最容易踩的坑!
  2. 成绩去重:
    用集合{score for _, score in students}自动去重,再排序就能得到从小到大的唯一成绩列表,取索引1就是第二低的成绩。
  3. 列表推导式的正确使用:
    筛选学生的列表推导式[name for name, score in students if score == second_lowest_score]直接过滤出符合条件的姓名,逻辑清晰高效。
  4. 姓名排序:
    最后用sorted(target_names)按字母顺序排序,满足题目要求的输出格式。

测试案例验证

比如输入:

5
Harry 37.21
Berry 37.21
Tina 37.2
Akriti 41
Harsh 39

运行代码后会输出:

Berry
Harry

完全符合预期。

内容的提问来源于stack exchange,提问作者Justin 3724

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:17:02