pythonで1次元配列を昇順で並べ替え、かつ並べ替える前の要素の位置の導出


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]

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




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 しないままの方が使いやすいと思います。

