我想返回排序列表的“反向”索引。我的意思是:我有一个未排序的列表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)做了一点速度测试。
剧本:
import datetime as DT
import random
U=[int(1000*random.random()) for i in xrange(pow(10,8))]
S=sorted(U)
idx = sorted(xrange(len(U)), key=U.__getitem__)
T0 = DT.datetime.now()
ridx = sorted(xrange(len(U)), key=idx.__getitem__)
print [S[ridx[i]] for i in range(len(U))]==U
elapsed = DT.datetime.now()-T0
print str(elapsed)
print '==============='
T0 = DT.datetime.now()
ridx = [ y for (x,y) in sorted(zip(idx, range(len(idx)))) ]
print [S[ridx[i]] for i in range(len(U))]==U
elapsed = DT.datetime.now()-T0
print str(elapsed)
结果:
True
0:02:45.278000
===============
True
0:06:48.889000
感谢大家快速而有意义的帮助!