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

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

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

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

Q&A

解決済

2回答

1584閲覧

pythonの辞書におけるvalueのマージソート

kawaramuu

総合スコア21

マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

0グッド

0クリップ

投稿2020/01/28 10:38

編集2020/01/28 12:53

pythonの辞書におけるvalueのソートに関してです。
以下の辞書のvalueでマージソートするプログラムを教えていただきたいです。(sortやsortedを使用せずにソートしたいです)
マージソートはマージソートの参照を参照して、プログラムを作成しています。
現在、valueのみのリストを作成し、valueのリストのソートはできているのですが、keyと分離しているため、希望する出力になりません。(プログラムのマージソートのの部分は参照先と同じものを使用しているため省略しています)
このような場合は、どのようにしてソートしたvalueともとの辞書のkeyを対応させるのでしょうか。
マージソートを使用して希望する出力が得られれば、他の方法でも問題ありません。

また、もし可能であれば、マージソートを降順にする方法も同時に教えていただけるとありがたいです。

python

1point = {'A': 10, 'B': 29, 'C': 4, 'D': 10, 'E': 18, 'F': 4} 2 3point_values = list(point.values()) 4print(merge_sort(point_values))

以下が現在の出力です。

[4, 4, 10, 10, 18, 29]

以下が希望する出力です。

[('B', 29), ('E', 18), ('A', 10), ('D', 10), ('C', 4), ('F', 4)]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

meg_

2020/01/28 11:27

・「安定ソート」とは質問においてどういう意味ですか? ・「valueでソートした場合、keyが対応しないため、詰まっています」 → valueのみのソートのコードを質問に追記してください。
can110

2020/01/28 11:28

sortedを使いたくない理由はなんでしょうか? (「じゃあlist.sort()で」という回答はOKですか?) また「辞書のkeyとvalueを分離して、valueでソートした場合、keyが対応しないため」というのが理解できません。実際にそのように動くコードを書いて動かしたうえで、なんらかの不都合が生じたということでしょうか?
LouiS0616

2020/01/28 11:49

とりあえず [int] のマージソートにトライしてみると良いと思います。 後からリストの中身を挿げ替えるのは案外簡単です。
kawaramuu

2020/01/28 12:35

内容が伝わりにくく、大変申し訳ありません。修正して再投稿しましたが、もし不明点があればコメントいただけると助かります。よろしくお願いいたします。
meg_

2020/01/28 12:45

「merge_sort()」のコードを提示いただかないと降順の方法も回答できないかと思います。
kawaramuu

2020/01/28 12:55 編集

marge_sort()の部分は参照先のマージソートと同じプログラムを使用させていただいています。先ほど,質問の内容を修正しました。何度も申し訳ありません。
guest

回答2

0

希望の結果を見る限りはキー・値の組の値を見て降順ソートを行いたい、ということでしょうか。sortedkey,reverse引数を活用すれば問題なくできるかと思います。

python

1>>> from operator import itemgetter 2>>> point = {'A': 10, 'B': 29, 'C': 4, 'D': 10, 'E': 18, 'F': 4} 3>>> sorted(point.items(), key=itemgetter(1), reverse=True) 4[('B', 29), ('E', 18), ('A', 10), ('D', 10), ('C', 4), ('F', 4)]

組み込み関数 — Python 3.8.1 ドキュメント

投稿2020/01/28 11:35

編集2020/01/28 11:36
hayataka2049

総合スコア30933

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

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

kawaramuu

2020/01/28 12:38

回答いただき、ありがとうございます。先ほど、質問を修正しました。大変申し訳ありません。
guest

0

ベストアンサー

リンク先のマージソートのコードを変更してみました。

Python

1def merge_sort_reverse(arr): 2 if len(arr) <= 1: 3 return arr 4 5 mid = len(arr) // 2 6 # ここで分割を行う 7 left = arr[:mid] 8 right = arr[mid:] 9 10 # 再帰的に分割を行う 11 right = merge_sort_reverse(right) 12 left = merge_sort_reverse(left) 13 14 # returnが返ってきたら、結合を行い、結合したものを次に渡す 15 return merge2(right, left) 16 17 18def merge2(left, right): 19 merged = [] 20 l_i, r_i = 0, 0 21 22 # ソート済み配列をマージするため、それぞれ左から見ていくだけで良い 23 while l_i < len(right) and r_i < len(left): 24 # ここで=をつけることで安定性を保っている 25 if right[l_i] >= left[r_i]: 26 merged.append(right[l_i]) 27 l_i += 1 28 else: 29 merged.append(left[r_i]) 30 r_i += 1 31 32 # 上のwhile文のどちらかがFalseになった場合終了するため、あまりをextendする 33 if l_i < len(right): 34 merged.extend(right[l_i:]) 35 if r_i < len(left): 36 merged.extend(left[r_i:]) 37 return merged 38 39print(merge_sort_reverse([1,2,3,4,5])) 40#[5, 4, 3, 2, 1]

Python

1d = {'A':1, 'B':2, 'C':3, 'D':4, 'E':5} 2values = merge_sort_reverse(list(d.values())) 3 4d2 = dict() 5 6for value in values: 7 for key in d: 8 if d[key] == value: 9 d2[key] = value 10 11print(d2) 12#{'E': 5, 'D': 4, 'C': 3, 'B': 2, 'A': 1}

投稿2020/01/28 13:32

meg_

総合スコア10579

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

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

kawaramuu

2020/01/28 13:55

ありがとうございます!希望する出力を得ることができました。 質問の意図を上手く伝えれず,大変申し訳ありませんでした。
hayataka2049

2020/01/28 13:59 編集

値をソートして二重ループでキーを探して押し込む、斜め上の力技ですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問