排序lis的反向索引

2024-09-24 02:28:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我想返回已排序列表的'reverse'索引。我的意思是:我有一个未排序的列表U,我通过S=sorted(U)对它进行排序。现在,我可以得到这样的排序索引U(idx)=S-但是我想要S(Ridx) = U。在

这里有一个小例子:

U=[5,2,3,1,4]

S=sorted(U)

idx = [U.index(S[i]) for i in range(len(U))]
>>> idx
[3, 1, 2, 4, 0]

Ridx = [S.index(U[i]) for i in range(len(U))]
>>> Ridx
[4, 1, 2, 0, 3]

>>>[U[idx[i]] for i in range(len(U))] == S
True

>>>[S[Ridx[i]] for i in range(len(U))] == U
True

我需要的是一个有效的方法来获得Ridx。在

谢谢!在


编辑:

好吧!我对这两个解决方案(@Jon Clements和@Whatang)做了一个小小的速度测试,回答了这个问题。在

剧本:

^{pr2}$

结果是:

True
0:02:45.278000
===============
True
0:06:48.889000

感谢你们所有人的快速和有意义的帮助!在


Tags: 方法intrue编辑列表forindexlen
3条回答

我所能想到的最有效的方法(可能不需要寻找numpy),它可以同时用于idx和{}:

U=[5,2,3,1,4]
idx = sorted(xrange(len(U)), key=U.__getitem__)
ridx = sorted(xrange(len(U)), key=idx.__getitem__)
# [3, 1, 2, 4, 0] [4, 1, 2, 0, 3]

有了numpy你就能做到

>>> import numpy as np
>>> U = [5, 2, 3, 1, 4]

>>> np.array(U).argsort().argsort()
array([4, 1, 2, 0, 3])

不完全是你所要求的数据结构,但我认为这可以得到你想要的信息:

>>> sorted(x[::-1] for x in enumerate(['z', 'a', 'c', 'x', 'm']))
[('a', 1), ('c', 2), ('m', 4), ('x', 3), ('z', 0)]

相关问题 更多 >