如何在Python中获取已排序数组的索引

问题描述 投票:158回答:8

我有一个数字列表:

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

现在如果我对此列表进行排序以获得[1, 2, 3, 5, 100]。我想要的是排序顺序中原始列表中元素的索引,即[0, 1, 2, 4, 3] --- ala MATLAB的sort函数,它返回值和索引。

python indexing sorted
8个回答
157
投票

如果你正在使用numpy,你可以使用argsort()函数:

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

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

这将返回对数组或列表进行排序的参数。


120
投票

像下一个:

>>> 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 ...]列表解析提取每个已排序元素的原始索引。


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

[0, 1, 2, 4, 3]

18
投票

enumerate的答案很好,但我个人不喜欢用于按值排序的lambda。以下只是反转索引和值,并对其进行排序。所以它首先按值排序,然后按索引排序。

sorted((e,i) for i,e in enumerate(myList))

11
投票

更新了enumerateitemgetter的答案:

sorted(enumerate(a), key=lambda x: x[1])
# [(0, 1), (1, 2), (2, 3), (4, 5), (3, 100)]

将列表压缩在一起:元组中的第一个元素是索引,第二个是值(然后使用元组x[1]的第二个值对其进行排序,x是元组)

或者使用itemgettermodule中的operator

from operator import itemgetter
sorted(enumerate(a), key=itemgetter(1))

4
投票

如果你不想使用numpy,

sorted(range(len(seq)), key=seq.__getitem__)

是最快的,正如here所示。


1
投票

其他答案都是错误的。

一次运行argsort不是解决方案。例如,以下代码:

import numpy as np
x = [3,1,2]
np.argsort(x)

收益array([2, 0, 1], dtype=int64)这不是我们想要的。

答案应该是两次运行argsort

import numpy as np
x = [3,1,2]
np.argsort(np.argsort(x))

按预期给予array([2, 0, 1], dtype=int64)


0
投票

将numpy导入为np

索引

S=[11,2,44,55,66,0,10,3,33]

r=np.argsort(S)

[output]=array([5, 1, 7, 6, 0, 8, 2, 3, 4])

argsort按排序顺序返回S的索引

为了价值

np.sort(S)

[output]=array([ 0,  2,  3, 10, 11, 33, 44, 55, 66])
© www.soinside.com 2019 - 2024. All rights reserved.