2017-08-22 9 views
0

のインデックスでリストの二つのリストはhereを説明したように、私はリストのリストをソートしたいと仮定しますソート内側のリスト

>>>L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
>>>sorted(L, key=itemgetter(2)) 
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']] 

今私は私がソートする第二のリストを持っている(またはラムダと。)同じ順序で、私はの新しい順序が必要です。 sorted()または.sort()はインデックスを返しません。どうやってやるの?

実際、私の場合、両方のリストにはnumpyの配列が含まれています。しかし、numpyソート/ argsortは、その場合にも直感的ではありません。

+0

...あなたにもnumpyの中に似た何かをすることができると思いますか? –

+0

私は最初のステップは私たちに完全な例を与えることだと思います。 2番目のリストは表示されません。そして、私も気が散っていません。 –

+0

したがって、最初の 'list'で実行されたシフトに基づいて、2番目のリストを順序付けますか?はいの場合は、注文する前に 'zip'してください。 –

答えて

1

私が正しく理解していれば、リストの並べ替え方法を知りたいと思うでしょう。など、ソート後の0番目の要素、すなわち、

もしそうなら、あなたは一歩離れている:与える

L2 = [L.index(x) for x in sorted(L, key=itemgetter(2))] 

:トビアスが指摘するように

[2, 0, 1] 

、これは不必要に複雑ですと比較して

map(itemgetter(0), sorted(enumerate(L), key=lambda x: x[1][2])) 
+1

長いリストの場合、これは非常に無駄であり、複雑さはO(n²)です。 'ソート(列挙(...))' –

2

私があなたを正しく理解していれば、Bを試験あなたはLに適用されるソートルールに基づいて以下の通りです。

L = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
B = ['a', 'b', 'c'] 

result = [i for _, i in sorted(zip(L, B), key=lambda x: x[0][2])] 
print(result) # ['c', 'a', 'b'] 
# that corresponds to [[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']] 
0

numpyの

セットアップ:

import numpy as np 
L = np.array([[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]) 
S = np.array(['a', 'b', 'c']) 

ソリューション:

print S[L[:,2].argsort()] 

出力:

['c' 'a' 'b'] 
これを見てみましょう

Just Python

両方のリストを結合し、それらを一緒に並べ替えて、別々に分けることができます。

>>> L = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']] 
>>> S = ['a', 'b', 'c'] 
>>> L, S = zip(*sorted(zip(L, S), key=lambda x: x[0][2])) 
>>> L 
([9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']) 
>>> S 
('c', 'a', 'b') 

私は、所望の出力_finally_が何であるかを

関連する問題