我正在解决一个难题,并列出了得分如下的学生:
arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]]
我希望得分第二高的学生将其数据存储在第二个列表fin_arr
中。如果只有一个学生,则仅存储该数据。这意味着上面的列表应该返回:
print(fin_arr)
[['A', 20.0],
['B', 20.0]]
我的解决方案有效,但仅适用于可以假设在倒数第二个和倒数第三个索引中找到第二高分的特定索引(列表不得超过5个条目) 。但是,如果列表是像上面一样的排序列表,该怎么办?我发现了几种评估列表的方法,但是还没有遇到专门检查子索引中索引是否相等的方法,因此我迷失了IDE的命令历史。最好的方法是什么?
答案 0 :(得分:3)
您可以使用itertools.groupby
:
arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]]
from itertools import groupby
from pprint import pprint
arr = [[*g] for v, g in groupby(sorted(arr, key=lambda k: k[-1]), lambda k: k[-1])]
if len(arr) > 1:
pprint(arr[1], width=20)
else:
print([])
打印:
[['A', 20.0],
['B', 20.0]]
答案 1 :(得分:1)
您可以使用np.sort()
和np.unique
来获得第二好成绩,然后使用列表理解。
这是它的样子:
import numpy as np
arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]]
second_best_grade = np.sort(np.unique([x[1] for x in arr]))[-2]
result = [x[0] for x in arr if x[1] == second_best_grade]
输出:
['A', 'B']