如何获得Python中排序数组的索引

303 投票
18 回答
388128 浏览
提问于 2025-04-16 19:59

我有一个数字列表:

myList = [1, 2, 3, 100, 5]

现在如果我把这个列表排序,得到 [1, 2, 3, 5, 100]。 我想要的是这些元素在原始列表中的位置,也就是按照排序后的顺序,得到 [0, 1, 2, 4, 3] —— 就像MATLAB的sort函数,它可以同时返回值和索引。

18 个回答

93

在编程中,有时候我们需要处理一些数据,比如从一个地方获取信息,然后在另一个地方使用这些信息。这就像你从冰箱拿出食材,然后在厨房里做饭一样。

当我们在代码中写东西时,有些时候会遇到错误或者问题。就像在做饭时,可能会忘记加盐,或者把食材放错地方。这些错误会让我们的程序无法正常运行。

为了让程序顺利运行,我们需要仔细检查每一步,确保所有的东西都在正确的位置,并且按照正确的顺序进行。这样才能做出美味的菜肴,或者在编程中,才能让程序正常工作。

如果你在编程时遇到问题,不要着急,慢慢来,仔细检查每一行代码,看看哪里可能出错了。就像做饭时,检查一下食材和步骤,确保一切都准备好了。

myList = [1, 2, 3, 100, 5]    
sorted(range(len(myList)),key=myList.__getitem__)

[0, 1, 2, 4, 3]
215

大概是这样的:

>>> myList = [1, 2, 3, 100, 5]
>>> [i[0] for i in sorted(enumerate(myList), key=lambda x:x[1])]
[0, 1, 2, 4, 3]

enumerate(myList) 会给你一个包含元组的列表,每个元组里有两个东西:一个是索引(位置),一个是值(内容):

[(0, 1), (1, 2), (2, 3), (3, 100), (4, 5)]

你可以通过把这个列表传给 sorted 来进行排序,并且指定一个函数来提取排序的关键(每个元组的第二个元素;这就是 lambda 的作用)。最后,使用 [i[0] for i in ...] 这种列表推导式来提取每个 sorted 元素的原始索引。

288

如果你在使用numpy这个库,你可以使用一个叫做argsort()的函数:

>>> import numpy
>>> numpy.argsort(myList)
array([0, 1, 2, 4, 3])

http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html

这个函数会返回一个结果,告诉你如何对数组或列表进行排序,也就是说,它会给出排序所需的索引。

撰写回答