我有一个问题,要从列表中获得两个最高的数字,当我编写代码并对其进行测试时,实际结果与我的预期有所不同。我原本只希望得到数字,但结果是用数字来命名,而当我更改#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)]
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]
我想,因为它是一个元组,您可以使用带有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