我试图找到对列表进行排序的最快方法。 例如,假设我试图对以下列表进行排序
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
,但除此之外,我认为不允许使用其他模块。
答案 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))