我有一个数字列表:
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的排序函数,返回两者 值和索引。
当前回答
我们将创建另一个从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]
为列表的项添加索引
myList = [[0, 1], [1, 2], [2, 3], [3, 100], [4, 5]]
下一个:
sorted(myList, key=lambda k:k[1])
结果:
[[0, 1], [1, 2], [2, 3], [4, 5], [3, 100]]
我用perfplot(我的一个项目)快速检查了这些功能的性能,发现很难推荐其他功能
np.argsort(x)
(注意对数刻度):
代码重现情节:
import perfplot
import numpy as np
def sorted_enumerate(seq):
return [i for (v, i) in sorted((v, i) for (i, v) in enumerate(seq))]
def sorted_enumerate_key(seq):
return [x for x, y in sorted(enumerate(seq), key=lambda x: x[1])]
def sorted_range(seq):
return sorted(range(len(seq)), key=seq.__getitem__)
b = perfplot.bench(
setup=np.random.rand,
kernels=[sorted_enumerate, sorted_enumerate_key, sorted_range, np.argsort],
n_range=[2 ** k for k in range(15)],
xlabel="len(x)",
)
b.save("out.png")
myList = [1, 2, 3, 100, 5]
sorted(range(len(myList)),key=myList.__getitem__)
[0, 1, 2, 4, 3]
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]
代码:
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)
试试这个,对我有用,干杯!