質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

4750閲覧

ソートする前とソートしたあとの配列の順序をトレースしたい python

moto_i

総合スコア20

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/03/23 04:01

編集2019/03/23 04:15

下記の配列があるとします。

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto_i

2019/03/23 05:51

回答ありがとうございます。 引き出しが一つ増えました。 頂いた答えを正確に理解できない部分もありますが。勉強していきたいと思います。
guest

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
Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto_i

2019/03/23 05:48

回答ありがとうございます。たった一行でここまでできることに驚きです。
guest

0

値に重複が無いので有れば、

Python

1NUM = [7,5,1,6,9] 2NUM1 = sorted(NUM, key=lambda x: -x) 3print(NUM1) 4print([NUM.index(x) for x in NUM1])

重複があると、最初に見つかった場所の添え字になりますね。

投稿2019/03/23 05:44

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto_i

2019/03/23 05:52

回答ありがとうございます。 すみません。値が重複することはあります。 このやりかたも参考にさせて頂きます。
guest

0

私ならオブジェクトの配列を用意する。

Pythonでできるかどうかわからんけど、

実際のデータと "確認用の配列" (リスト?) をひとまとめにしたオブジェクトの配列にしておく。

それを自前でバブルソートやマージソートといった試すべきソートを組んで、

移動させる前に "確認用の配列" に 現在の場所を入れておく。

これを完了するまで行う。

...うん? ちょっと待って。もしかして 元と後のやつの場所比較ってこと?

それなら普通に 二つの配列を用意すればいいだけじゃないの?

オリジナルを num_org[] (すでにデータが入っているとして) として これをコピーして num_sorted[] を定義。

この num_sorted[] のほうをソートする。

で、num_sorted[i] が num_org[] のどこにあるかforとかでチェックする。

っていう風にすればいいんじゃないの?

投稿2019/03/23 05:10

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moto_i

2019/03/23 05:31

回答ありがとうございます。 伝わりにくくてみません A= {"魚","肉","菓子","米","麺") B= (7,5,1,6,9) という配列があって、 1位 麺 9個、 2位 魚 7個 3位 米 のような情報がわかるようにしたいのです。
BeatStar

2019/03/23 05:50

>> A= {"魚","肉","菓子",... これって、AとBってセットでしょうか? AとBが別物ならいいですけど、AとBで一つだとするならC言語でいう構造体でやりますね。私なら。 魚,肉,菓子...って種類 ( ってことにして ) ですよね。 なので、種類と 売れた個数 を構造体にしておく。 で、この個数を基準にソートすれば、わざわざAとBという配列を用意して元の位置を...って考えなくてもいいし。
BeatStar

2019/03/23 05:52

へえーっ。 Lhankor_Mhyさんがご提示なさった方法もPythonにはあるんですねぇ。 なるほど...
moto_i

2019/03/23 05:55

回答ありがとうございます。C言語なら私も構造体を使います。 すごく勉強になります。
moto_i

2019/03/23 05:56

セットの意味がよくわかってないです。すみません。
BeatStar

2019/03/23 06:53 編集

>> セットの意味がよく... あー、私は「ワンセット」っていう意味で使っていました。 "麺" と 9 で一つ。 "魚" と 7 で一つ。っていう風にしている意味。 ( もちろん、ファイルにあるデータによって組み合わせが違うだろうけど、返信での例なら...ね ) たまたま "麺" が 9 じゃなくて、 "麺" が9単位( 袋だったり個数だったりするので。 ) っていう風にするなら構造体。( Pythonに構造体がないなら、クラスで 代用するとか。 )
Lhankor_Mhy

2019/03/23 07:06

横からすみません。 Pythonには構造体もインターフェースもありませんです。一応、抽象クラス的なものはあります。 こういうときは辞書を使うことが多いと思います。
moto_i

2019/03/23 15:19

BeatStarさん、対応ありがとうございました。 Lhankor_Mhyさんのプログラムでしたいプログラミングができました。
BeatStar

2019/03/25 01:53

Lhankor_Mhyさん。 あー、なるほど。辞書...ですか。 Pythonにやっぱり構造体はないんですねぇ... ( 一応Javaにも無いことから何となく考えてはいましたが... )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問