如何索引列表中的3个最高值?

rud*_*ter 11 python

所以我有这两个列表:

score = [350, 914, 569, 223, 947, 284, 567, 333, 697, 245, 227, 785, 120, 794, 343, 773, 293, 995]
name = [Ryan, Stacy, Jenna, Peter, Sophie, Bryan, Cole, Andrea, Emily, Blake, Mike, Stephan, Rob, Eliza, Heather, Daniel, Elisabeth, Samantha]
Run Code Online (Sandbox Code Playgroud)

我必须找到3个最高分,并将这些分数与名单中的各自得分者进行统计,这样我才能有新的名单

top3score = [947, 995, 914]
top3name = [Sophie, Samantha, Stacy]
Run Code Online (Sandbox Code Playgroud)

我正在考虑索引最高分,将它们添加到列表中,而不是使用索引将这些分数与名称相符.

我的问题是如何索引列表中的3个最高值?然后,我如何使用索引在名称列表中查找记分员名称,以便我可以将它们附加到top3name列表中?

sbe*_*rry 26

我想这会做到的

sorted(zip(score, name), reverse=True)[:3]
Run Code Online (Sandbox Code Playgroud)

所以你了解发生了什么:

zip:将iterables作为参数,并从每个iterable中获取一个元素,将它们放在元组中.

所以:

>>> zip(score, name)
[(350, 'Ryan'), (914, 'Stacy'), (569, 'Jenna'), (223, 'Peter'), (947, 'Sophie'), (284, 'Bryan'), (567, 'Cole'), (333, 'Andrea'), (697, 'Emily'), (245, 'Blake'), (227, 'Mike'), (785, 'Stephan'), (120, 'Rob'), (794, 'Eliza'), (343, 'Heather'), (773, 'Daniel'), (293, 'Elisabeth'), (995, 'Samantha')]
Run Code Online (Sandbox Code Playgroud)

已排序:将对数据进行排序.默认情况下,元组元素在0索引中的元素上排序,因此在这种情况下得分.Reverse = True将首先降序排序.

最后,[:3]是切片符号,说给我从开头到第三个元素的所有元素.这也可以写成[0:3]

  • 添加`reverse = True` (5认同)

Rik*_*ggi 16

如果您只对前三名感兴趣,那就是heapq.nlargest:

>>> heapq.nlargest(3, zip(score, name))
[(995, 'Samantha'), (947, 'Sophie'), (914, 'Stacy')]
Run Code Online (Sandbox Code Playgroud)

来自官方文件:

heapq.nlargest(n, iterable, key=None)

返回一个列表,其中包含iterable定义的数据集中的n个最大元素.key(如果提供)指定一个参数的函数,该函数用于从iterable中的每个元素中提取比较键:key=str.lower相当于:sorted(iterable, key=key, reverse=True)[:n]

业绩通知:

后两个[ nlargestnsmallest]对于较小的n值表现最佳.对于较大的值,使用该sorted()函数更有效.此外,何时n==1使用内置min()max()功能更有效.