我有一个数字列表:
myList = [1, 2, 3, 100, 5]
现在如果我对这个列表进行排序得到[1,2,3,5,100]。 我想要的是元素的下标 原始列表的排序顺序,即[0,1,2,4,3] ——ala MATLAB的排序函数,返回两者 值和索引。
我有一个数字列表:
myList = [1, 2, 3, 100, 5]
现在如果我对这个列表进行排序得到[1,2,3,5,100]。 我想要的是元素的下标 原始列表的排序顺序,即[0,1,2,4,3] ——ala MATLAB的排序函数,返回两者 值和索引。
当前回答
如果您不想使用numpy,
sorted(range(len(seq)), key=seq.__getitem__)
是最快的,如这里所示。
其他回答
使用enumerate的答案很好,但我个人不喜欢用lambda来按值排序。下面的操作只是倒转索引和值,并对其排序。首先是按值排序,然后是按下标排序。
sorted((e,i) for i,e in enumerate(myList))
如果你使用numpy,你有argsort()函数可用:
>>> import numpy
>>> numpy.argsort(myList)
array([0, 1, 2, 4, 3])
http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
这将返回对数组或列表进行排序的参数。
如果您不想使用numpy,
sorted(range(len(seq)), key=seq.__getitem__)
是最快的,如这里所示。
我们将创建另一个从0到n-1的索引数组 然后压缩到原始数组,然后根据原始值对其排序
ar = [1,2,3,4,5]
new_ar = list(zip(ar,[i for i in range(len(ar))]))
new_ar.sort()
`
像下面这样:
>>> 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并指定一个函数来提取排序键(每个元组的第二个元素;这就是的意义。最后,使用[i[0] for i in…列表理解。