首页 > 解决方案 > 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,但除此之外我认为不允许使用其他模块。

标签: pythonarraysperformancenumpysorting

解决方案


如果您需要显着加速,则必须使用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. ])

推荐阅读