为了账号安全,请及时绑定邮箱和手机立即绑定

提取列表中 n 个最高值的索引

提取列表中 n 个最高值的索引

吃鸡游戏 2021-06-14 20:54:10
将对应于另一个列表的 n 个最高值的索引提取到列表中的最有效方法是什么,同时保留我们从中提取索引的列表?例如,假设我们有以下索引列表:foo = [107,6,34,12,82]如果我们请求列表 foo 的 2 个最高值的索引,它应该返回以下列表:bar = [0,4]这是我现在正在运行的,它真的效率低下,一点也不优雅,我真的不知道如何改进它:foo = [107, 6, 34, 12, 82]tmp = list(foo)bar = []no_of_indices_wanted = int(input())for n in range(no_of_indices_wanted):    bar.append(foo.index(max(foo)))    foo.pop(foo.index(max(foo)))foo = tmp
查看完整描述

3 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

您可以使用enumerate注释每个项目的索引,然后使用heapq.nlargest获取列表的最高两个,然后将索引提取到列表中:


import heapq

from operator import itemgetter

print(list(map(itemgetter(0), heapq.nlargest(2, enumerate(foo), key=itemgetter(1)))))

这输出: [0, 4]


查看完整回答
反对 回复 2021-06-16
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

另一种方法是:


foo = [107,6,34,12,82]

n=2

[i for i, x in sorted(enumerate(foo), key=lambda x: -x[1])[:n]]

#[0, 4]


查看完整回答
反对 回复 2021-06-16
?
慕仙森

TA贡献1827条经验 获得超7个赞

您可以对 的元组进行排序(value, index),然后恢复索引。


def n_highest(lst, n):

    ordered = sorted([(value, idx) for idx, value in enumerate(lst)], reverse=True)

    return [idx for value, idx in ordered[:n]]


print(n_highest([107, 6, 34, 12, 82], 2))

输出

[0, 4]


查看完整回答
反对 回复 2021-06-16
  • 3 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信