Python : 辞書を要素とするリストのソート

Pythonのリストと辞書を組み合わせて、辞書の要素で並べ替えをしたい。
例えば、表1のようなデータがあったとき、scoreの大きい順にならべかえたい。

表1 成績データ表
score_list =[
    {'name' : 'A' , 'score' : 92} ,
    {'name' : 'B' , 'score' : 72} ,
    {'name' : 'C' , 'score' : 46} ,
    {'name' : 'D' , 'score' : 23} ,
    {'name' : 'E' , 'score' : 85} ,
    {'name' : 'F' , 'score' : 76}    
]

辞書は、順番を管理しないので、辞書をリストに載せて、順番の管理をします。今は氏名の順(普通は学籍番号順)になっていますが、これを得点の高い順に並べ替えたいわけです。

リストには、sort()というメソッドがあり、得点だけであれば、簡単に並び替えることができます。

scores = [92, 72, 46, 23, 85, 76]
scores.sort(reverse=True)
print(scores)

【実行結果】
[92, 85, 76, 72, 46, 23]

リストのメソッドsort()は、リストの内容を変更してしまいます。リストの内容を変更したくないときは、組み込み関数sorted()を利用します。

scores = [92, 72, 46, 23, 85, 76]
sorted_list  = sorted(scores , reverse = True)
print(sorted_list)

【実行結果】
[92, 85, 76, 72, 46, 23]

sort()もsorted()も、keyパラメータを指定すると、各要素にメソッドを適用した結果を並び替えることができます。
例えば、リストの要素が文字列だったとき、各文字列の文字数が小さい順(短い順)に並べ替えたいとしたら以下のようになります

word_list = ['is' , 'as' , 'will' , 'was' , 'aims' , 'wolf' , 'there']
print(sorted(word_list , key=len))

組み込み関数len() で各要素の文字数を求め、その結果短い順に並び替えられます
【実行結果】
['is', 'as', 'was', 'will', 'aims', 'wolf', 'there']
余談ですが、文字列は、仮面ライダーゼロワンにゆかりがあるのですが、そんなこと気づく人いないよね(文字サイズを小さくする方法がわからないnote初心者)

辞書の中の一つの要素を取りす関数を作成して、keyにそれを指定すると、各要素のうち、得点を並び替えることができます。

def get_score(one) : 
    return one['score']

score_list =[
    {'name' : 'A' , 'score' : 92} ,
    {'name' : 'B' , 'score' : 72} ,
    {'name' : 'C' , 'score' : 46} ,
    {'name' : 'D' , 'score' : 23} ,
    {'name' : 'E' , 'score' : 85} ,
    {'name' : 'F' , 'score' : 76}    
]
sorted_list = sorted(score_list , key=get_score , reverse=True)
print(sorted_list)

【実行結果】
[
{'name': 'A', 'score': 92},
{'name': 'E', 'score': 85},
{'name': 'F', 'score': 76},
{'name': 'B', 'score': 72},
{'name': 'C', 'score': 46},
{'name': 'D', 'score': 23}
]

【おまけ】
最大値・最小値を求める組み込み関数max()・min()も同じことができます
辞書の中から'score'の最大値を求めることができます。

def get_score(one) : 
    return one['score']

score_list =[
    {'name' : 'A' , 'score' : 85} ,
    {'name' : 'B' , 'score' : 72} ,
    {'name' : 'C' , 'score' : 46} ,
    {'name' : 'D' , 'score' : 23} ,
    {'name' : 'E' , 'score' : 93} ,
    {'name' : 'F' , 'score' : 76}    
]

max_one = max(score_list , key=get_score)
print(max_one)