我有一个数字列表:
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,你有argsort()函数可用:
>>> import numpy
>>> numpy.argsort(myList)
array([0, 1, 2, 4, 3])
http://docs.scipy.org/doc/numpy/reference/generated/numpy.argsort.html
这将返回对数组或列表进行排序的参数。
其他回答
使用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)。
myList = [1, 2, 3, 100, 5]
sorted(range(len(myList)),key=myList.__getitem__)
[0, 1, 2, 4, 3]
我们将创建另一个从0到n-1的索引数组 然后压缩到原始数组,然后根据原始值对其排序
ar = [1,2,3,4,5]
new_ar = list(zip(ar,[i for i in range(len(ar))]))
new_ar.sort()
`
更新的答案与枚举和项目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))