リストの数値が小さい順にindexを表示したいです。例えば、次のようなリストがあって
python
1lst=[9,3,6,1,2]
これを「数が大きい順に並べて、それぞれ元合った場所のindexを返す」ためにはどうすればよいでしょうか?
python
1[3,4,1,2,0] 2#最小値(1) のlst内でのindexは 3 3#2つ目(2) のlst内でのindexは 4 4#最大値(9) のlst内でのindexは 0 5
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
ベストアンサー
numpyならargsortで一発です。
素のpythonでやるには、enumerateと組み合わせ、sortedのkey引数を活用してあげます。
python
1>>> lst=[9,3,6,1,2] 2>>> [i for i, _ in sorted(enumerate(lst), key=lambda x:x[1])] 3[3, 4, 1, 2, 0] 4>>> import numpy as np # numpyの例 5>>> np.array(lst).argsort() 6array([3, 4, 1, 2, 0])
投稿2019/04/17 14:32
編集2019/04/17 14:37総合スコア30939
0
enumerateでインデックスを付けて丸ごとソートし、必要な部分だけ取り出せば良いです。
Python
1import operator 2 3lst = [9, 3, 6, 1, 2] 4 5dst = sorted( 6 enumerate(lst), key=operator.itemgetter(1) 7) 8print(dst) 9 10dst = [idx for idx, _ in dst] 11print(dst)
実行結果 Wandbox
[(3, 1), (4, 2), (1, 3), (2, 6), (0, 9)] [3, 4, 1, 2, 0]
投稿2019/04/17 14:31
編集2019/04/17 14:32総合スコア35676
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
※コメントにてご指摘あったように、以下のコードにはいろいろ欠点があるのでおすすめしません。
hayataka2049氏のおっしゃるargsort関数が良いかと思います。
このようなコードはいかがでしょうか。
lst=[9,3,6,1,2] lst2=sorted(lst)#小さい順にソート #ソート後の要素がソート前どこにあったか探す for i in range(len(lst2)): for j in range(len(lst)): if lst2[i]==lst[j]:#ソート後とソート前の要素が一致するとき lst2[i]=j#indexをlst2に与える break
ご参考になれば幸いです。
投稿2019/04/17 14:43
編集2019/04/17 14:59総合スコア1029
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
提示結果からすると小さい順に並べて
ですよね。
Python
1lst=[9,3,6,1,2] 2ret = list(map(lambda x:x[0], sorted(dict(enumerate(lst)).items(), key=lambda x:x[1]))) 3print(ret) # [3, 4, 1, 2, 0]
投稿2019/04/17 14:35
総合スコア38352
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。