sortやsortedでリストをソートする【Python】

282, 2021-07-02

目次

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()でソートする

  • タプルや文字列をソートする

ソートとは?

ソートとは並べ替えのことを言います。
小さい順や古い順、大きい順や新しい順に整列させることをソートと言います。

たとえば↓のような数列があったとします。

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引数のreversesort()の場合と同様です。

sorted()はソートした結果をコピー(シャローコピー)で返します。

リストをsort()でソートする

リストをsort()でソートするには↓のようにします。

l = [3, 1, 2]
l.sort()
print(l)
# [1, 2, 3]

逆順(降順)にするには↓のようにreverseTrueにします。

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のリストのソートについて見てみました。
ソートは非常によく使われるアルゴリズムと言えます。

ソートしてあげる

安定なソートは快適