从列表中获得两个最高分

问题描述 投票:0回答:2

我有一个问题,要从列表中获得两个最高的数字,当我编写代码并对其进行测试时,实际结果与我的预期有所不同。我原本只希望得到数字,但结果是用数字来命名,而当我更改#TEST时,甚至用错误的数字来命名。我该怎么办?谢谢。

(#TEST不应更改,谢谢)

import heapq
def get_two_highest_marks(names_marks_list):
    a = heapq.nlargest(2, names_marks_list)
    return a

#TEST

names_marks = [("Ian", 78), ("Siggy", 88), ("Andy", 68), ("Irene", 90), ("Gio", 59)]
top_two = get_two_highest_marks(names_marks)
print(top_two)

预期结果

[88, 90]

实际结果

[('Siggy', 88), ('Irene', 90)]

另一个例子

import heapq
def get_two_highest_marks(names_marks_list):
    a = heapq.nlargest(2, names_marks_list)
    return a

#TEST

names_marks = [("David", 88), ("Lee", 68), ("Teo", 60), ("Jo", 91)]
top_two = get_two_highest_marks(names_marks)
print(top_two)

预期结果

[88, 91]

实际结果

[('Teo', 60), ('Lee', 68)]
python
2个回答
0
投票

Heapq有一个key参数,它允许您指定自己的函数来标识排序键。在这种情况下,您要对每个元组(数字部分)中位于第二个元组索引1处的第二项进行排序。因此,您可以定义一个名为key的函数,该函数将返回每个元组的第二项并将其用于选择。

您可以通过在函数调用中使用key = key来启用此功能。

另一个困惑的根源是,您基于数值回到元组,也许您只是在寻找数字。如果是这种情况,您可以使用列表理解功能列出所有x [1]值。

import heapq

def key(x):
    return x[1]

def get_two_highest_marks(names_marks_list):
    a = heapq.nlargest(2, names_marks_list, key=key)
    return [x[1] for x in a[::-1]]

#TEST

names_marks = [("David", 88), ("Lee", 68), ("Teo", 60), ("Jo", 91)]
top_two = get_two_highest_marks(names_marks)
print(top_two))

或者,如果您想要更简单的方法,只需在测试之前将所有代码替换为此:

def get_two_highest_marks(names_marks_list):
    return sorted([x[1] for x in names_marks_list])[-2:]

输出

[88, 91]

0
投票

我想,因为它是一个元组,您可以使用带有lambda的sorted()分别获得列表中的两个最高分,如下所示

def get_two_highest_marks(names):
    a = sorted(names, key=lambda x: x[1], reverse=True)[1]
    b = sorted(names, key=lambda x: x[1], reverse=True)[0]
print a,b
© www.soinside.com 2019 - 2024. All rights reserved.