リストの並び替えはsort
やsorted
でサクッと書けるが、辞書のリストの並び替えをすぐ忘れてしまうのでメモ。lambdaを使うのはわかっているのだが、なかなか記憶に定着しないので書いてみる。
2021/01/05追記:
Python3.8.5で動作したことを確認したとともに、print
の記述をPython3系の書き方に修正しました。
まずは基本のsortとsorted
sort()は破壊的。
降順にしたいときはsort(reverse=True)
。
nums = [3, 1, 9, 6]
nums.sort()
print(nums) # [1, 3, 6, 9]
nums.sort(reverse=True)
print(nums) # [9, 6, 3, 1]
sorted()は非破壊的。
降順にしたいときはsorted(hoge_list, reverse=True)
。
nums_1 = [3, 1, 9, 6]
nums_2 = sorted(nums_1)
print(nums_1) # [3, 1, 9, 6]
print(nums_2) # [1, 3, 6, 9]
nums_3 = sorted(nums_1, reverse=True)
print(nums_3) # [9, 6, 3, 1]
辞書の並び替えはlambdaを使う
items()
を使うのでタプルになる。sort()
は使えない。
keyで並び替えたいとき
score = {'kokugo': 33, 'sansuu': 85, 'eigo': 60}
score.sort() # AttributeError: 'dict' object has no attribute 'sort'
score_sorted = sorted(score.items(), key=lambda x:x[0])
print(score_sorted) # [('eigo', 60), ('kokugo', 33), ('sansuu', 85)]
valueで並び替えたいとき
score = {'kokugo': 33, 'sansuu': 85, 'eigo': 60}
score_sorted = sorted(score.items(), key=lambda x:x[1])
print(score_sorted) # [('kokugo', 33), ('eigo', 60), ('sansuu', 85)]
ここから本題。辞書のリスト
lambdaのreturn部分のindex指定を、ソートしたいkeyにするだけ。
scores = [
{'kokugo': 33, 'sansuu': 85},
{'kokugo': 77, 'sansuu': 23},
{'kokugo': 55, 'sansuu': 100}
]
scores_sorted = sorted(scores, key=lambda x:x['kokugo'])
print(scores_sorted)
# [
# {'kokugo': 33, 'sansuu': 85},
# {'kokugo': 55, 'sansuu': 100},
# {'kokugo': 77, 'sansuu': 23}
# ]
参考
Python Tips:dict(辞書)型の中身をソートしたい
Pythonのリストを辞書型のvalue値でソートする方法メモ