You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在嵌套列表中判断分数相等并提取次高分学生数据?

解决通用已排序学生分数列表的次高分提取问题

嘿,我明白你现在的困扰——硬编码索引确实太局限了,完全没法适配不同长度的列表。其实我们可以利用列表已排序的特性(或者做通用处理)来写出灵活的解决方案,不管列表有多长都能正确提取次高分的所有学生数据。

方法一:利用已降序排列的特性(高效版)

既然你的输入列表是按分数降序排列的(像示例里那样,最高分在最前面),我们可以直接利用这个排序来快速定位次高分:

arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]]

fin_arr = []
if len(arr) >= 2:
    # 降序排列下,第一个元素的分数就是最高分
    max_score = arr[0][1]
    # 找到第一个不等于最高分的分数,这就是次高分
    second_max = None
    for student in arr:
        if student[1] != max_score:
            second_max = student[1]
            break
    # 收集所有分数等于次高分的学生
    fin_arr = [s for s in arr if s[1] == second_max]

print(fin_arr)  # 输出: [['A', 20.0], ['B', 20.0]]

代码解释:

  • 先处理边界情况:如果列表里学生少于2个,自然没有次高分,直接返回空列表。
  • 因为列表是降序的,第一个学生的分数就是最高分,不用额外遍历找最大值。
  • 遍历列表找到第一个分数低于最高分的学生,他的分数就是次高分(降序排列下,后面的分数只会更小,所以这就是我们要的次高值)。
  • 最后用列表推导式把所有分数等于次高分的学生都收集起来,不管有多少个都能一次性搞定。

方法二:通用版(兼容未排序的情况)

如果不确定输入列表是否一定是排序好的,或者可能遇到乱序的情况,可以用这种更通用的方法,先提取所有唯一分数再排序:

arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]]

# 提取所有分数并去重,然后降序排序
unique_scores = sorted({s[1] for s in arr}, reverse=True)
fin_arr = []

if len(unique_scores) >= 2:
    second_max = unique_scores[1]
    fin_arr = [s for s in arr if s[1] == second_max]

print(fin_arr)  # 输出同样正确

代码解释:

  • 用集合提取所有唯一的分数,这样自动去掉重复值。
  • 把唯一分数降序排序,第二个元素就是次高分(不管原列表顺序如何)。
  • 同样用列表推导式收集对应分数的学生数据,逻辑简单易懂。

这两种方法都完全不依赖固定索引,不管你的列表是5个元素还是500个元素,都能正确工作。你可以根据输入列表是否排序来选择对应的方法~

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

火山引擎 最新活动