28

所以我有这两个列表:

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]

我必须找到 3 个最高分,并将这些分数与名单中各自的得分手相提并论,这样我才能有新的名单

top3score = [947, 995, 914]
top3name = [Sophie, Samantha, Stacy]

我正在考虑对最高分数进行索引,将它们附加到列表中,而不是使用索引将这些分数与名称进行统计。

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

4

3 回答 3

42

我认为这会做到

sorted(zip(score, name), reverse=True)[:3]

所以你明白发生了什么:

zip:将可迭代对象作为参数,并从每个可迭代对象中获取一个元素,将它们放在一个元组中。

所以:

>>> 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')]

sorted:将对数据进行排序。默认情况下,元组元素按索引为 0 的元素排序,因此本例中的分数。Reverse=True 将首先对其进行降序排序。

最后,[:3]is slice 表示法,说给我从开始到第三个元素的所有元素。这也可以写成[0:3]

于 2012-04-14T08:21:33.760 回答
25

如果您只对前 3 名感兴趣,则有heapq.nlargest

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

来自官方文档

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

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

业绩预告:

后两个 [nlargest和] 对于较小的nnsmallest值表现最佳。对于较大的值,使用该函数更有效。此外,当 时,使用内置和函数更有效。sorted()n==1min()max()

于 2012-04-14T08:28:21.207 回答
0

如果您想获取索引而不是另一个列表中的相应元素,我创建了一个函数来按列表值对索引进行排序。

def sort_index(lst, rev=True):
    index = range(len(lst))
    s = sorted(index, reverse=rev, key=lambda i: lst[i])
    return s

输出

让我们尝试对样本列表的索引进行排序。

>>> score = [12, 48, 100, 9, 30]
>>> sort_index(score)
[2, 1, 4, 0, 3]

如果要获取三个最大值的索引,只需对列表进行切片即可。

>>> sort_index(score)[:3]
[2, 1, 4]

它还支持使用参数从小到大排序rev=False

>>> sort_index(score, rev=False)
[3, 0, 4, 1, 2]
于 2021-11-05T12:09:43.737 回答