如何在Python中获取sorting数组的索引

我有一个数字列表:

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

现在,如果我sorting这个列表来获得[1, 2, 3, 5, 100] 。 我想要的是从sorting的原始列表中的元素的索引,即[0, 1, 2, 4, 3] 0,1,2,4,3 [0, 1, 2, 4, 3] – MATLAB的sorting函数返回值和索引。

像下一个:

 >>> 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)给你一个包含(index,value)元组的列表:

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

通过将列表传递给sorted列表,并指定一个函数来提取sorting关键字(每个元组的第二个元素;这就是lambda ),最后,每个sorting元素的原始索引使用[i[0] for i in ...]列表理解。

如果你使用的是numpy,你可以使用argsort()函数:

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

这将返回将sorting数组或列表的参数。

 In [15]: myList = [1, 2, 3, 100, 5] In [16]: sorted(range(len(myList)),key=lambda x:myList[x]) Out[16]: [0, 1, 2, 4, 3] 

也:

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

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

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

enumerateitemgetter更新答案:

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

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

或者使用来自operator模块的itemgetter

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