下記の配列があるとします。
NUM = [7, 5,1,6,9]
NUM[0] = 7, NUM[1] = 5. NUM[2] = 1, NUM[3] = 6, NUM[4]= 9
これをソートすると
NUM = [9,7,6,5,1]
になりますが、大きい順にソートする前の配列番号がどのように
動いたかを確認できるプログラムの書き方を教えてください。
この場合ですと
NUM[4], NUM[0], NUM[3], NUM[1], NUM[2]
という情報が知りたいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
numを直接ソートする代わりにnumの添え字をソートすると並べ替えを一度きりにできます。この方法を使うとsortアルゴリズムが安定ソートでない場合でも安定ソートにできるという応用もききます。(自分はPythonのsortedが安定ソートなのかどうなのかすぐに出てきませんが...)
sorted関数のkey引数はかなり使い出があります(というよりそれを使わないと大したソートができないともいえましょう)。
python
1num = [7, 5, 1, 6, 9] 2indices = [*range(len(num))] 3sorted_indices = sorted(indices, key=lambda i: -num[i]) 4sorted_num = [num[i] for i in sorted_indices] 5print(sorted_num) # ==> [9, 7, 6, 5, 1] 6print(sorted_indices) # ==> [4, 0, 3, 1, 2]
sorted関数にせよなんにせよ関数の機能を覚える際にどんな引数があるか(どんなオプション機能があるか)をよく把握しておくことがプログラミングの幅を広げる(要するにできることの引き出しを増やしておく)ためのコツと思います。
投稿2019/03/23 05:24
総合スコア18404
0
enumerate
で添え字ごとタプルにしてソートする、というのはどうでしょう?
python
1NUM = [7, 5,1,6,9] 2list( zip( *reversed( sorted( [ ( x, i ) for i, x in enumerate( NUM ) ] ) ) ) )[1] 3#(4, 0, 3, 1, 2)
追記
1位 麺 9個、 2位 魚 7個 3位 米 のような情報がわかるようにしたいのです。
それなら、こうでしょうか。
python
1A= ("魚","肉","菓子","米","麺") 2B= (7,5,1,6,9) 3print( *reversed( sorted( zip( B, A ) ) ) ) 4#(9, '麺') (7, '魚') (6, '米') (5, '肉') (1, '菓子')
投稿2019/03/23 05:30
編集2019/03/23 05:51総合スコア37437
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
私ならオブジェクトの配列を用意する。
Pythonでできるかどうかわからんけど、
実際のデータと "確認用の配列" (リスト?) をひとまとめにしたオブジェクトの配列にしておく。
それを自前でバブルソートやマージソートといった試すべきソートを組んで、
移動させる前に "確認用の配列" に 現在の場所を入れておく。
これを完了するまで行う。
...うん? ちょっと待って。もしかして 元と後のやつの場所比較ってこと?
それなら普通に 二つの配列を用意すればいいだけじゃないの?
オリジナルを num_org[] (すでにデータが入っているとして) として これをコピーして num_sorted[] を定義。
この num_sorted[] のほうをソートする。
で、num_sorted[i] が num_org[] のどこにあるかforとかでチェックする。
っていう風にすればいいんじゃないの?
投稿2019/03/23 05:10
総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/23 07:06

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/23 05:51