

pythonで1次元配列を昇順で並べ替え、かつ並べ替える前の要素の位置も導出したいです。  
sort関数だと前の要素の位置は残らないと思うので困っています。

[code]

    li = [22, 50, 30, 46, 25, 12, 18, 19]
    
[/code]

導出後

[code]

    li1 = [12, 18, 19, 22, 25, 30, 46, 50]
    li2 = [5, 6, 7, 0, 4, 2, 3, 1]
    
[/code]

以上のような結果を求めたいです。よろしくお願いします。


CC BY-SA 3.0
2015-12-04T00:43:04.570
19612
2015-12-04T02:27:19.927
2015-12-04T02:27:19.927
2521
13514
question
python
pythonで1次元配列を昇順で並べ替え、かつ並べ替える前の要素の位置の導出


1行に詰め込むと

[code]

    li1, li2 = [list(l) for l in zip(*sorted(zip(li, range(len(li))))]
    
[/code]

でどうでしょう。`zip()` で各要素に配列での位置を追加した上でソート、"unzip" で２つに分けてます。"unzip" については  
<https://stackoverflow.com/questions/19339/a-transpose-unzip-function-in-
python-inverse-of-zip>  
を参考にして `zip(*zipped)` を使いました。求められてる答えが tuple じゃなくて list
なのでさらに複雑になってますが、それがなければ

[code]

    li1, li2 = zip(*sorted(zip(li, range(len(li))))
    
[/code]

です。

どちらにしろ、用途によっては unzip しないままの方が使いやすいと思います。


CC BY-SA 3.0
2015-12-04T01:03:32.550
19613
2015-12-04T01:03:32.550
2017-05-23T12:38:55.307
-1
2521
19612
answer

[code]

    >>> li1, li2 = sorted(li), sorted(range(len(li)), key=lambda k: li[k])
    
[/code]


CC BY-SA 3.0
2015-12-04T01:47:57.660
19615
2015-12-04T01:47:57.660
19612
answer