python - 有效地在 python 列表中查找 nlargest 元素的索引
问题描述
我们可以使用 heapq nlargest 来获取 nlargest 元素的值。我需要找到最大元素的索引。有什么建议么?
解决方案
import random
import heapq
values = list(range(10))
random.shuffle(values)
n = 3
pairs = heapq.nlargest(n, zip(values, range(len(values))))
indices = [i for value, i in pairs]
print(values) # [0, 2, 8, 1, 5, 7, 4, 6, 3, 9]
print(pairs) # [(9, 9), (8, 2), (7, 5)]
print(indices) # [9, 2, 5]
这似乎只比使用enumerate
. 这是一些计时代码:
setup = """
import random
import heapq
import timeit
import operator
values = list(range(10000))
random.shuffle(values)
n = 200
key = operator.itemgetter(1)
"""
stmt1 = """
pairs = heapq.nlargest(n, zip(values, range(len(values))))
indices = [i for value, i in pairs]
"""
stmt2 = """
pairs = heapq.nlargest(n, enumerate(values), key=key)
indices = [i for i, value in pairs]
"""
import timeit
print(timeit.timeit(stmt1, setup, number=1000))
print(timeit.timeit(stmt2, setup, number=1000))
推荐阅读
- javascript - Axios post request not sent to external url: TypeError: ns.GetCommandSrc is not a function
- java - Java.IO.io 异常处理
- java - Cucumber:在执行第一个脚本“警告:在类路径中找不到功能:/Runner”时显示
- javascript - 在 nodejs 中将货币符号写入文件的问题
- azure-sql-database - 将 ssis 2008 c# 架构升级到 2016 for azure
- vue.js - 如何在测试模式而不是生产模式下运行赛普拉斯?
- javascript - 在另一个屏幕中更改状态也会更改 DrawerNavigation 的状态
- azure-devops - Azure DevOps - 迭代更改
- sql - 在使用分区创建新列时,我得到了?在新列数据中
- excel - 以月为单位计算日期之间的差异,并根据定义的截止日期 MS EXCEL