如何在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))
用enumerate
和itemgetter
更新答案:
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))