Python 测试嵌套列表中的相等性并将结果附加到另一个列表?
我正在解决一个挑战,下面列出了一组得分的学生:Python 测试嵌套列表中的相等性并将结果附加到另一个列表?,python,Python,我正在解决一个挑战,下面列出了一组得分的学生: arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]] 我希望得分第二高的学生将其数据存储在第二个列表中。如果只有一个学生,则只存储该数据。这意味着上述列表应返回: print(fin_arr) [['A', 20.0], ['B', 20.0]] 我的解决方案是可行的,但这只适用于特定的索引,在这些索引中,可以假设第二高的分数出现在倒数第二和倒数第三的索
arr = [['E', 21.0], ['A', 20.0], ['B', 20.0], ['C', 19.0], ['D', 19.0]]
我希望得分第二高的学生将其数据存储在第二个列表中。如果只有一个学生,则只存储该数据。这意味着上述列表应返回:
print(fin_arr)
[['A', 20.0],
['B', 20.0]]
我的解决方案是可行的,但这只适用于特定的索引,在这些索引中,可以假设第二高的分数出现在倒数第二和倒数第三的索引中(列表必须不超过5个条目)。但是如果列表是一个像上面那样的排序列表呢?我找到了几种评估列表的方法,但没有遇到专门检查子索引中索引的相等性的方法,我在IDE的命令历史中迷失了方向。实现这一目标的最佳方法是什么?您可以使用
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]]
您可以使用
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']
将列表转换为另一种数据结构(允许基于属性(如数据帧或字典)进行排序)会有帮助吗?如果愿意,您可以发布一个答案。对需要的数据结构没有任何约束,但是整个代码块(我没有在这里显示)的编写方式可能会把整个事情搞砸。尽管如此,我也希望能看到一篇短文。谢谢使用
操作符.itemgetter(1)
而不是lambda
稍微更有效一些。此外,您还可以使用(arr[1:2]或[[])[0]