回答編集履歴

1

質問を受けて追記

2022/07/21 12:47

投稿

TakaiY
TakaiY

スコア12779

test CHANGED
@@ -2,3 +2,32 @@
2
2
 
3
3
  クイックソートの方を、「dictのリストを受け取って、そのdictの指定されたキーの順に並べ替える」というものに変更すればいいのではないかと思います。
4
4
  それほど大きな修正にはならないと思いますよ。
5
+
6
+ ---
7
+ 質問を受けて追記します。
8
+
9
+ ポイントは、今回比較したいのは、リストに入っているものそのものでなくて、その要素の1つであることです。
10
+
11
+ まず、quick_sort ()関数は、中に入っている数値の比較をしていないので、そのままでOKです。
12
+ 1箇所している比較は、リストのインデックスですね。
13
+
14
+ 実際に入れ替えをしているのは partition()関数の方ですね。
15
+ ```python
16
+ def partition(nums, beginning, ending):
17
+ i = beginning - 1
18
+ pivot = nums[ending]
19
+ for j in range(beginning, ending):
20
+ if nums[j] <= pivot:
21
+ i += 1
22
+ nums[i], nums[j] = nums[j], nums[i]
23
+ nums[i + 1], nums[ending] = nums[ending], nums[i + 1]
24
+ return i+1
25
+ ```
26
+ ここで、 iとjは インデックスですから、そのままでいいのですね。
27
+ この中で比較している場所が1箇所、「nums[j] <= pivot」これです。このときの、nums[j] はリストの要素ですから、たとえば、{"NAMAE":"A ","KOKUGO":80,"SUGAKU":95, "GOUKEI", 175}のようなdictです。これそのものを比較したいものではありませんよね。 比較したいのは、さらにこの中の"GOUKEI"の値のはずです。なのでここは、「if nums[j]["GOUKEI"] <= pivot:」 としなければなりません。
28
+ また、ここで比較しているpivotは、この前で値を入れていますが、ここも「 pivot = nums[ending]["GOUKEI"]」のように目的の値を使うようにします。
29
+ 基本的にこれで済むはずです。
30
+ 他の部分も含めて考えてみてください。
31
+
32
+ さらに、ここでは、"GOUKEI"を直接使いましたが、関数の引数で受け取るようにして、quick_sort関数でも受け取るようにしてやれば、国語の成績でも、算数の成績でも並べ替えられるようにできますね。
33
+