TL;DR
sort()は元のリストをソートするメソッドに対し、sorted() は、常に新しいオブジェクトで返す関数である。
sorted() のポイント
- iterable の要素を並べ替えた新たなリストを返す
- 結果は常に新しいオブジェクトで返される
- 引数に不変な型も受け取ることができる
- 戻り値は常にリストである
- 文字と整数が混在するとエラーになるので引数に無名関数を使う
sorted(iterable, *, key=None, reverse=False)
sorted() - 組み込み関数 — Python 3.9.4 ドキュメント
sorted 関数 と sort メソッド の違い
リストをソートする場合、以下の 2 通りの方法がある。
- 組み込み関数 sorted 関数
- リスト自身が持つ sort メソッド
sort()は元のリストをソートするメソッドに対し、sorted() は、常に新しいオブジェクトで返す関数。
# sorted()
sorted(list型変数)
# sort()
list型変数.sort()
違いを比較してみる。sort()は元のリストも破壊的に変更されてしまうが、sorted()は元のリストは変更されない。
sort()
sort()によって元のリストは変更されてしまう。
# sort()
x = [8, 2, 7, 6, 1]
print(x) # 元のリストも破壊的に変更された
# [1, 2, 6, 7, 8]
sort()自体は None を返す。
x = [4, 2, 1, 5, 3]
y = x.sort()
print(y) # None
print(x) # [1, 2, 3, 4, 5]
sorted()
sorted()は元のリストは変更されない。
# sorted()
s = [8, 2, 7, 6, 1]
print(sorted(s))
# [1, 2, 6, 7, 8]
print(s) # 元のリストは変更されない
# [8, 2, 7, 6, 1]
絶対値で並べ替える
sorted()を使う場合、リストにマイナスが入ると、マイナス順に ソート されてしまう。絶対値でソートしたいときは、第二引数に key 引数を設定する。
sorted(イテラブル, key=abs)
マイナス値が入っている整数を並べ替えてみよう。
# リストにマイナスが入ると、マイナス順にソートされる
x = [1, -2, 3, -4]
x.sort()
print(x)
# [-4, -2, 1, 3]
# 絶対値でソートしたいときは、key引数を使う
y = [1, -2, 3, -4]
print(sorted(y, key=abs))
# [1, -2, 3, -4]
文字と整数をソート
文字と整数が混在するときは、エラーになるので、引数 key に無名関数を指定する。以下は lambda を key に入れている例。ソートされるときに、lambda に渡されるため、比較に利用する値を返す。
x = ['1', 2, '3', 4]
sorted(x, key=lambda v: int(v))
# sorted(リスト, 名前=lambda 引数: 式)
# ['1', 2, '3', 4]
逆順にソートする
逆順にソートしたいときは、reverse=True を使う。
x = [1, 3, 9, 2]
sorted(x, reverse=True)
# [9, 3, 2, 1]
大文字と小文字を区別せずにソートする
関数を指定することもできる。key に関数 str.lower を指定すると要素が小文字に変換された後に、ソート結果が出力される。
x = ['d', 'B', 'a', 'c']
print(sorted(x)) # ['B', 'a', 'c', 'd']
y = ['d', 'B', 'a', 'c']
print(sorted(y, key=str.lower)) # ['a', 'B', 'c', 'd']