我有一个数字列表:

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

现在如果我对这个列表进行排序得到[1,2,3,5,100]。 我想要的是元素的下标 原始列表的排序顺序,即[0,1,2,4,3] ——ala MATLAB的排序函数,返回两者 值和索引。


当前回答

s = [2, 3, 1, 4, 5]
print([sorted(s, reverse=False).index(val) for val in s]) 

对于一个有重复元素的列表,它将返回不带联系的秩,例如。

s = [2, 2, 1, 4, 5]
print([sorted(s, reverse=False).index(val) for val in s]) 

返回

[1, 1, 0, 3, 4]

其他回答

像下面这样:

>>> 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…列表理解。

更新的答案与枚举和项目getter:

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

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

或者使用来自operatormodule '的itemgetter:

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

如果您不想使用numpy,

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

是最快的,如这里所示。

使用Numpy包最简单的方法:

import numpy
s = numpy.array([2, 3, 1, 4, 5])
sort_index = numpy.argsort(s)
print(sort_index)

但是如果你想要你的代码应该使用baisc python代码:

s = [2, 3, 1, 4, 5]
li=[]
  
for i in range(len(s)):
      li.append([s[i],i])
li.sort()
sort_index = []
  
for x in li:
      sort_index.append(x[1])
  
print(sort_index)

其他答案都是错误的。

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

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

生成数组([1,2,0],dtype=int64),这不是我们想要的。

答案应该是运行argsort两次:

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

按预期给出数组([2,0,1],dtype=int64)。