Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 测试嵌套列表中的相等性并将结果附加到另一个列表?_Python - Fatal编程技术网

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]