sortやsortedでリストをソートする【Python】
- 作成日: 2021-07-01
- 更新日: 2023-12-26
- カテゴリ: Python
Pythonでリストをソートする
Pythonではデータ構造としてリストを使えます。
このリストはsort()メソッドやsorted()関数を使うことでソート(並べ替え)することができます。
結論から言うとPythonのリストのソートは↓のようにやります。
l = [3, 1, 2]
l.sort()
print(l)
# [1, 2, 3]
l = [3, 1, 2]
sorted_l = sorted(l)
print(sorted_l)
# [1, 2, 3]
この記事ではPythonのリストのソートについて具体的に↓を見ていきます。
- ソートとは?
- sort()の構造
- sorted()の構造
- リストをsort()でソートする
- リストをsorted()でソートする
- タプルや文字列をソートする
関連記事
Pythonのリスト内包表記まとめ
Pythonでリスト(配列)に普通に要素を追加する方法
for文とリストの賢い使い方4つ【Python】
ソートとは?
ソートとは並べ替えのことを言います。
小さい順や古い順、大きい順や新しい順に整列させることをソートと言います。
たとえば↓のような数列があったとします。
4 3 1 2
この数列を小さい順にソートすると↓のようになります。
1 2 3 4
この時このソートを昇順ソートと言います。
また逆に大きい順にソートすると↓のようになります。
4 3 2 1
この時このソートを降順ソートと言います。
ソートはバイナリーサーチなどのアルゴリズムの事前準備などに使われることがあります。
また、単純にデータを整列させたい場合に便利なアルゴリズムと言えます。
ソートのアルゴリズムはいろいろありますが、プログラムの世界ではクイックソートによる実装が一般的です。
またバブルソートは初心者の練習用として優秀なアルゴリズムと言えます。実用性はあまりありませんが。
sort()の構造
Pythonのリスト(list
)はそのメソッドとしてsort()
を持っています。
これは破壊的にリストをソートするメソッドです。
sort()
は↓のような構造になっています。
list.sort(*, key=None, reverse=False)
sort()
の第1引数key
にはソートするキーを返す関数を指定します。
第2引数のreverse
はソートを昇順にしたい場合はFalse
を、降順にしたい場合はTrue
を指定します。
sort()
は返り値を返さず、リストを破壊的に変更してソートします。
sorted()の構造
組み込み関数のsorted()
はオブジェクトをソートしてその結果をコピーとして返します。
sorted()
は↓のような構造になっています。
sorted(iterable, *, key=None, reverse=False)
sorted()
の第1引数iterable
にはイテレーション可能なオブジェクト(リストやタプルなど)を渡します。
第2引数のkey
と第3引数のreverse
はsort()
の場合と同様です。
sorted()
はソートした結果をコピー(シャローコピー)で返します。
リストをsort()でソートする
リストをsort()
でソートするには↓のようにします。
l = [3, 1, 2]
l.sort()
print(l)
# [1, 2, 3]
逆順(降順)にするには↓のようにreverse
をTrue
にします。
l = [3, 1, 2]
l.sort(reverse=True)
print(l)
# [3, 2, 1]
オブジェクトが保存されているリストの場合は↓のようにkey
にラムダ式を指定します。
class Book:
def __init__(self, price):
self.price = price
l = [Book(3), Book(1), Book(2)]
l.sort(key=lambda book: book.price)
for book in l:
print(book.price)
# 1
# 2
# 3
↑の場合、sort()
でソートするときにkey
に指定したラムダ式が呼ばれます。
ラムダ式の引数にはリストの要素(Book
)が渡されるので、このオブジェクトのprice
属性をキーに指定します。
結果はprice
の値で各オブジェクトがソートされています。
リストをsorted()でソートする
リストをsorted()
でソートしたい場合は↓のようにします。
l = [3, 1, 2]
sorted_l = sorted(l)
print(sorted_l)
# [1, 2, 3]
sorted()
はsort()
と違いソート結果をコピーで返すので注意が必要です。
sorted()
でもソートを逆順(降順)にしたい場合はreverse
を指定します。
l = [3, 1, 2]
sorted_l = sorted(l, reverse=True)
print(sorted_l)
# [3, 2, 1]
key
の指定も同様にラムダ式などの関数を指定します。
class Book:
def __init__(self, price):
self.price = price
l = [Book(3), Book(1), Book(2)]
sorted_l = sorted(l, key=lambda book: book.price)
for book in sorted_l:
print(book.price)
# 1
# 2
# 3
タプルや文字列をソートする
タプルや文字列はイミュータブル(変更不能)なオブジェクトなので、sort()
を持っていません。
そのためソートしたい場合はsorted()
を使います。
タプルのソートは↓のようにします。
t = (3, 1, 2)
sorted_t = sorted(t)
print(sorted_t)
# [1, 2, 3]
文字列のソートは↓のようにします。
s = '312'
sorted_s = sorted(s)
print(sorted_s)
# ['1', '2', '3']
文字列のソートの場合は、↑の結果を見てもわかる通り結果がリストとして返ってきます。
そのため結果を文字列にしたい場合は↓のようにjoin()
などを使います。
s = '312'
sorted_s = ''.join(sorted(s))
print(sorted_s)
# 123
おわりに
今回はPythonのリストのソートについて見てみました。
ソートは非常によく使われるアルゴリズムと言えます。
🦝 < ソートしてあげる
🐭 < 安定なソートは快適