Python:排序列表和保留索引的最快方法

时间:2021-03-17 18:21:46

标签: python arrays performance numpy sorting

我试图找到对列表进行排序的最快方法。 例如,假设我试图对以下列表进行排序

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, value),它可以是两个单独的列表。重要的部分是对值进行排序,并且还知道列表 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,但除此之外,我认为不允许使用其他模块。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

算不算使用 lst_val = sorted(lst) 然后使用 .index() 来查找值的索引。像这样:

lst = [1, 0, -1, 0.1, 0, 5, 10, 4]
lst_val = sorted(lst)
lst_idx = []

for i in lst_val:
    lst_idx.append(lst.index(i))