lisz-works

プログラミングと興味を貴方に

python3 list.sort()/sorted(list)の使い方

【スポンサーリンク】

Python

こんにちは、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()内最大値を順番に並べた要素の順でソートされます。

keyを使ったソートのイメージ

ld.sort(key=_sort_max)を実行したざっくりとした処理のイメージはこんな感じ。

  1. _sort_max(要素1)が実行される
  2. max(要素1.values())の結果が返される
  3. これをldの要素3つ分全て行う
  4. _sort_max()を実行した結果として[50(要素1), 500(要素2), 5000(要素3)]が用意される
  5. この結果がソートされるので[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を用いてソートするのが訳わからず調べた結果です。

調べたお陰で使い方がわかってきました。

今後何かで役立つといいなー

www.lisz-works.com

www.lisz-works.com