ユーニックス総合研究所

  • home
  • archives
  • python-list-sort

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

🦝 < ソートしてあげる

🐭 < 安定なソートは快適