Pythonでリストの要素をソート(並べ替え)するには以下2つの関数があります。
- listのメソッド: list.sort()
- 標準組込み関数: sorted(iterable)
本記事では、これらの違いと使い方についてまとめます。
list.sort()、sorted()の違い
それぞれの違いは下記の通りです。
関数名 | 内容 |
---|---|
list.sort() |
|
sorted() |
|
[Python] イテレータとイテラブルについて
以下、それぞれの関数の詳細について記載します。
list.sort()
リストをインプレースでに並び替えます(デフォルトは昇順)。返却値はNoneです。
リストのメソッドなので、リスト以外は使えません。
※第二引数以降のkey, reverseについては後述。
list.sort(*, key=None, reverse=False)
例を以下に示します。
>>> a = [2, 0, 5, 1, 9]
>>> a.sort() #返却値はNoneなので何も表示されません
>>> a
[0, 1, 2, 5, 9] #元のデータが変わっています
sorted()
任意のイテラブルを引数に設定することが出来ます。
返却値はソートされたリストです(デフォルトは昇順)。元のデータは変わりません。
※第二引数以降のkey, reverseはsort()と同様で後述します。
sorted(iterable, *, key=None, reverse=False)
例を以下に示します。
>>> a= [2, 0, 5, 1, 9]
>>> sorted(a) #ソートされた新たなリストが返却
[0, 1, 2, 5, 9]
>>> a
[2, 0, 5, 1, 9] #元のデータは変わっていません
sorted()はリスト以外のイテラブルでも使えます。
※タプルや辞書の様に要素の中身が2つ以上ある場合は、一番左の要素でソートされます。
別の要素でソートする場合は後述のKeyパラメータを使います。
以下、具体例を示します。
#タプル(一番左側の要素でソート)
>>> l = [("b", 3), ("a", 1), ("c", 2)]
>>> sorted(l)
[('a', 1), ('b', 3), ('c', 2)]
#文字列
>>> l = "2143"
>>> sorted(l)
['1', '2', '3', '4']
#辞書(keyでソートされます)
>>> l = {"b": 3, "a": 1, "c": 2}
>>> sorted(l)
['a', 'b', 'c']
#dic.keys()を使っても同様の結果
>>> sorted(l.keys())
['a', 'b', 'c']
#dic.values()を使うと、辞書のvalueがソートされます
>>> sorted(l.values())
[1, 2, 3]
#dic.items()を使うと、辞書データをタプルを要素としたリストを返却
#タプルの一番左の要素でソートされます。
>>> sorted(l.items())
[('a', 1), ('b', 3), ('c', 2)]
Key function
keyパラメータを使うと、並べ替えの際に条件を指定することができます。
(要素をソートする際にデータを加工したり、ソートする要素を指定したり・・・)
具体的な例をいくつか挙げてみます。
例その1:単語の大文字・小文字を区別なく並べ替える
keyパラメータにkey=str.lowerを設定すると、文字列が全て小文字に変換されてからソートされます。
>>> s = ['How', 'do', 'you', 'get', 'to', 'the', 'Train', 'Station?']
>>> sorted(s, key = str.lower)
['do', 'get', 'How', 'Station?', 'the', 'to', 'Train', 'you']
例その2:タプルの二番目の値でソートしたい場合
lambda関数を使うことも可能です。
以下は、タプルの二番目の要素でソートした場合の例です。
>>> l = [("b", 3), ("a", 1), ("c", 2)]
>>> sorted(l, key = lambda x:x[1])
[('a', 1), ('c', 2), ('b', 3)]
尚、この処理はOperatorモジュール(この場合はitemgetter()メソッド)を使うと、もう少し簡単に書けます。
>>> from operator import itemgetter
>>> sorted(l, key = itemgetter(1))
[('a', 1), ('c', 2), ('b', 3)]
例その3:文字列の長さでソートしたい場合
key = lenとすると文字列の長さでソートできます。
下記は文字列を長さの短い順に並べた例です。
>>> s = ['How', 'do', 'you', 'get', 'to', 'the', 'Train', 'Station?']
>>> sorted(s, key = len)
['do', 'to', 'How', 'you', 'get', 'the', 'Train', 'Station?']
例その4:辞書のvalueでKeyをソートする場合
辞書のvalueでkeyを並び替える例を2つ示します。
>>> d = {"b": 3, "a": 1, "c": 2}
# items()でkey, valueペアのタプルを生成し、2番目の要素で並び替え
>>> sorted(d.items(), key = lambda x: x[1])
[('a', 1), ('c', 2), ('b', 3)]
# 辞書のvalueをlambdaで指定し、keyを並び替え
>>> sorted(d, key = lambda x: d[x])
['a', 'c', 'b']
reverseパラメータ
reverseパラメータは昇順でソートするか、降順でソートするかを設定します。
- reverse = False : 昇順(デフォルト)
- reverse = True:降順
例を以下に示します。
#list.sort()の場合
>>> a = [2, 0, 5, 1, 9]
>>> a.sort(reverse = True)
>>> a
[9, 5, 2, 1, 0]
#sorted()の場合
>>> a = [2, 0, 5, 1, 9]
>>> sorted(a, reverse = True)
[9, 5, 2, 1, 0]
確認した環境
- OS: Ubuntu 20.04LTS
- Python: ver3.11.2
まとめ
今回は、データの並べ替えについてまとめました。
- list.sort()とsorted()の使い方と違い
- キーワード引数key, reverseの使い方