ソートされたリストの「逆」インデックスを返したいです。つまり、並べ替えられていないリストが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
迅速かつ有意義なヘルプをありがとうございました!