こんにちは、lisです!
pythonでリストの中身をソートする方法として2つあります。
list.sort()とsorted(list)です。
今回はこのソート関数の使い方についてです。
sortとsortedってどんなもの?
ソートするための関数が2種類あるけど違いは?というとこんな感じ。
- list.sort()は、listの値を直接ソートする
- sorted(list)は、listの値をソートした結果を返す
ソートしたいリストに直接反映するか、戻り値でもらうかの差ですね。
数値リストをソート
数値のリストをソートした場合です。
>>> l = [6, 3, 5, 4, 1, 2] >>> >>> sorted(l) [1, 2, 3, 4, 5, 6] >>> l [6, 3, 5, 4, 1, 2] >>> >>> l.sort() >>> l [1, 2, 3, 4, 5, 6]
この通りsorted()はソート結果を返しますが、変数の中身に変化はありません。
sort()の場合は変数の値が直接ソートされています。
文字列リストをsort
文字列でもソートしてくれます。
>>> l = ['c', 'a', 'd', 'b'] >>> >>> sorted(l) ['a', 'b', 'c', 'd'] >>> l ['c', 'a', 'd', 'b'] >>> >>> l.sort() >>> l ['a', 'b', 'c', 'd']
sortにkeyを指定してlist[dict]をソートする
listの中身がdictの場合、直接はソートができません。
その場合は引数key
に関数を指定します。
その関数で得た結果によってソートすることが可能。
>>> # sort時[0]番目となったら{...}が渡される >>> def _sort_max(d): ... # valuesで1番大きいやつを返す ... return max(d.values()) ... >>> l = [ ... {'d3': 50, 'a3': 10, 'c3': 40, 'b3': 15}, ... {'d1': 500, 'a1': 100, 'c1': 400, 'b1': 150}, ... {'d2': 5000, 'a2': 1000, 'c2': 4000, 'b2': 1500}, ... ] >>> l.sort(key=_sort_max) >>> l [{'d3': 50, 'a3': 10, 'c3': 40, 'b3': 15}, {'d1': 500, 'a1': 100, 'c1': 400, 'b1': 150}, {'d2': 5000, 'a2': 1000, 'c2': 4000, 'b2': 1500}]
この例の場合、listの要素であるdictのvalues()の中から最大値を返す関数を作成している。
「dict内の値を取り出して、1番大きいやつを返す」ってことですね。
これを引数keyに渡すことで、各要素のvalues()内最大値を順番に並べた要素の順でソートされます。
ld.sort(key=_sort_max)
を実行したざっくりとした処理のイメージはこんな感じ。
_sort_max(要素1)
が実行される- max(要素1.values())の結果が返される
- これをldの要素3つ分全て行う
- _sort_max()を実行した結果として
[50(要素1), 500(要素2), 5000(要素3)]
が用意される - この結果がソートされるので
[5000(要素3), 500(要素2), 50(要素1)]
が最終的な結果となる
keyに関数を指定してソートする
keyはdictが絡んでいるとき……というわけではなく、単純なソートではないソートの仕方をしたいときに使えます。
適当な実行例を書いてみます。
>>> def tuple_multi(t): ... a, b = t ... return a * b ... >>> l = [(1, 5), (2, 3), (9, 0)] >>> sorted(l, key=tuple_multi) [(9, 0), (1, 5), (2, 3)]
>>> x = [2, 4, 1, 3] >>> def sortx(i): ... return x[i] ... >>> >>> l = [0, 1, 2, 3] >>> sorted(l, key=sortx) [2, 0, 3, 1]
あとがき
python3 list.sort()/sorted(list)の使い方でした!
そもそもsortとsortedの違いもよくわかっていないまま、keyを用いてソートするのが訳わからず調べた結果です。
調べたお陰で使い方がわかってきました。
今後何かで役立つといいなー