python - Python:排序列表和保留索引的最快方法
问题描述
我正在尝试找到对列表进行排序的最快方法。例如,假设我试图对以下列表进行排序
lst = [1, 0, -1, 0.1, 0, 5, 10, 4]
最后我想要的是拥有排序列表,但也能够lst
在排序之前知道它们的索引是什么。
我目前使用的方法是这个
lst = [1, 0, -1, 0.1, 0, 5, 10, 4]
lst = list(enumerate(lst))
lst.sort(key = lambda x: x[1], reverse = True)
这样做会给lst = [(6, 10), (5, 5), (7, 4), (0, 1), (3, 0.1), (1, 0), (4, 0), (2, -1)]
现在我不一定需要有元组(idx,值),它可以是两个单独的列表。重要的部分是对值进行排序,并且还知道 list 中的“原始”索引是什么lst
。所以例如得到:
lst_val = [10, 5, 4, 1, 0.1, 0, 0, -1]
lst_idx = [6, 5, 7, 0, 3, 1, 4, 2]
现在我想知道是否有更快/更有效的方法来排序,因为我可以有一个包含超过 200,000 个值的列表。
允许使用numpy
,但除此之外我认为不允许使用其他模块。
解决方案
如果您需要显着加速,则必须使用numpy
import numpy as np
np_lst = np.array(lst)
sorted_indices = np_lst.argsort() #array([2, 1, 4, 3, 0, 7, 5, 6])
然后,您可以通过这种方式对数组进行“排序”:
np_lst[sorted_indices]
#array([-1. , 0. , 0. , 0.1, 1. , 4. , 5. , 10. ])
您也可以通过以下方式反过来获得它:
np_lst[sorted_indices[::-1]]
#array([10. , 5. , 4. , 1. , 0.1, 0. , 0. , -1. ])
推荐阅读
- spring - Spring:spring-data-mongodb 或 spring-boot-starter-data-mongodb
- html - 隐藏视频背景溢出
- vba - 用 word 文档中的复制内容替换新邮件中的关键字
- node.js - Cloud Functions 从实时数据库路径获取列表
- windows - 如何在 Windows 上获取当前的屏幕保护程序?
- python - pythonic将元素添加到嵌套列表的方法
- python - 如何使用 TensorFlow ObjectDetection API 中的自定义输入分辨率设置特定的 SSD (lite) 预测架构
- php - 如何在 url 中放置变量并使用 php header 提交表单
- xml - 使用 VBA 或 VB6 从 url (https) 下载 xml 文件
- c# - 为什么编译器不允许将 Class.System.Type 作为 T 参数传递给泛型方法