5

ソートされたリストの「逆」インデックスを返したいです。つまり、並べ替えられていないリストがUあり、それを で並べ替えますS=sorted(U)。これで、次のようなソート インデックスを取得できますがU(idx)=SS(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

迅速かつ有意義なヘルプをありがとうございました!

4

5 に答える 5

5

私が考えることができる最も効率的な(おそらく探していることを除いてnumpy) and を取り除き、と の両方に.index使用できます。idxridx

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]
于 2013-08-20T23:18:47.387 に答える
1

すでにリストがあると仮定するとidx、次のことができます

ridx = [ y for (x,y) in sorted(zip(idx, range(len(idx)))) ]

次に、i0 からすべてのlen(U)

S[ridx[i]] == U[i]

辞書を使用すると、ソートを回避できます。

ridx_dict = dict(zip(idx, range(len(idx))))

これはリストに変換できます。

ridx = [ ridx_dict[k] for k in range(len(idx)) ]

順列について考えることが、この問題の鍵です。順列を書き留める 1 つの方法は、すべてのインデックスを 1 行に順番に書き、その下の行にそのインデックスを持つ要素の新しいインデックスを書き込むことです。たとえば、あなたの例では

0 1 2 3 4
3 1 2 4 0

この 2 行目はidxリストです。列を読み下げると、インデックス 0 で始まる要素はインデックス 3 に移動し、インデックス 1 で始まる要素はインデックス 1 にとどまる、というようになります。

逆順列ridxあなたが探しているものです。これを見つけるには、列を保持する順列の下の行を並べ替えてから、新しい一番上の行を書き留めます。したがって、例は次のようになります。

4 1 2 0 3
0 1 2 3 4
于 2013-08-20T23:28:00.043 に答える
0

質問を正しく理解していれば(私は理解していませんでした)、 U.index(S[i]) が探しているものだと思います

編集:元のインデックスの辞書を保存して、検索構文を非常に単純に保つことができると思います

OIDX = {U[i]: i for i in range(0, len(U))}
S = sorted(U)
OIDX[S[i]]
于 2013-08-20T22:07:54.580 に答える