Python
コンテナデータ型
list
ソート

Python のリストソート: 説明と例

データの並べ替えはプログラミングの基本的なアルゴリズムであり、実際の開発で最も頻繁に実行されるタスクの1つです。 その重要性から、Pythonはさまざまな関数やメソッドでソートのためのメソッドをいくつか提供しています。 ほとんどの場合、Pythonの組み込み関数を使う方が、自分でコードを書くよりも信頼性が高く、高速だからです。

そこでこの記事では、Pythonが提供するリストソートのメソッドを見てみましょう。 基本的な sorted() 関数または sort() メソッドから始めて、いくつかの状況をカバーします。

1. ソートされたリストを返す sorted() 関数

sorted()関数は与えられたリストを引数として受け取り、昇順にソートされた新しいリストを返す組み込み関数です。元のリストは変更されません。

sorted()関数を使うには、以下のようにパラメータとしてソートしたいリストを渡します。

unsorted_list = [5, 2, 8, 1, 3]
sorted_list = sorted(unsorted_list)
 
print(sorted_list)  # Output: [1, 2, 3, 5, 8]

2. 逆パラメータによる降順ソート

sorted() 関数は keyreverse の2つのパラメータを受け取ります。

このうち reverse パラメータは降順にソートするかどうかを指定するもので、 True を渡すと降順にソートします。 セクション1で見たように、sorted()関数がデフォルトで昇順にソートされるのは、このパラメータがデフォルトで False に設定されているからです。

unsorted_list = [5, 2, 8, 1, 3]
sorted_list = sorted(unsorted_list, reverse=True)
 
print(sorted_list)  # Output: [8, 5, 3, 2, 1]

3. key パラメータを使用したカスタム基準によるソート

sorted() 関数を使って昇順や降順以外のカスタム基準でソートしたい場合は、 key パラメータを使用します。 新しいソート基準を適用するために key パラメータに組み込み関数やカスタム関数を渡すことができます。

組み込み関数を渡してソートする例から始めましょう。

Python 組み込み関数 len を key 関数に渡して、その戻り値である文字列の長さでソートします。 パラメータ reverse に値を渡していないので、昇順でソートされることに注意してください。

words = ['apple', 'banana', 'cherry', 'date', 'fig']
sorted_words = sorted(words, key=len)
 
print(sorted_words)  # Output: ['fig', 'date', 'apple', 'banana', 'cherry']

以下は lambda 関数で定義したカスタム関数を渡してソートする例です。

名前と年齢の値を持つ複数の辞書を年齢の値で整理する、 ラムダ関数では、リストの各メンバーを user とし、ソートする age キーに対応する値を取得します。

users = [
    {
        'name': 'Alice',
        'age': 30
    },
    {
        'name': 'Bob',
        'age': 25
    },
    {
        'name': 'Charlie',
        'age': 35
    },
    {'
        name': 'David',
        'age': 28
    }
]
 
sorted_users = sorted(users, key=lambda user: user['age'])
 
print(sorted_users)

4. 複数条件によるソート

複数の条件でソートするには、key 関数から希望する条件値のタプルを返します。

以下の例では、映画データをレーティングと公開年でソートしています。 'Memento'と'Prestige'は同じレーティングですが、リリース年でソートされています。

movies = [
    {
        'title': 'Inception',
        'year': 2010,
        'rating': 8.8
    },
    {
        'title': 'Interstellar',
        'year': 2014,
        'rating': 8.6
    },
    {
        'title': 'The Prestige',
        'year': 2006,
        'rating': 8.5
    },
    {
        'title': 'Memento',
        'year': 2000,
        'rating': 8.5
    }
]
sorted_movies = sorted(movies, key=lambda movie: (movie['rating'], movie['year']))
print(sorted_movies)

5. None を返す list.sort() メソッド

list.sort() メソッドは Python のリストクラスの主要な組み込みメソッドです。 先ほど見た sorted() 関数 とは異なり、このメソッドはリスト自身をソート状態にし、None を返します。

以下のコードのように、sort()[:py} メソッドをソートしたいリストに対して呼び出すことができます。

unsorted_list = [5, 2, 8, 1, 3]
unsorted_list.sort()
 
print(unsorted_list)  # Output: [1, 2, 3, 5, 8]

sort()メソッドには2つのパラメータがあります: keyreverse です。これらは seorted( 関数と同じ目的です。

unsorted_list = [5, 2, 8, 1, 3]
unsorted_list.sort(reverse=True)
 
print(unsorted_list)  # Output: [8, 5, 3, 2, 1]
 
names = ['Alice', 'Bob', 'Charlie', 'David']
names.sort(key=len)
 
print(names)  # Output: ['Bob', 'Alice', 'David', 'Charlie']

6. list.sort() メソッド vs. sorted() 関数

Python でソートに使われる2つのメソッドの主な違いは、元のリストを操作するかどうかです。

list.sort() メソッドは元のリストをソートします。 これは元のリストを保持しません。sorted()関数は元のリストを保持し、新しいソートされたリストを返します。

list.sort()メソッドはより少ないメモリで済むという利点がありますが、sorted()関数は元のリストを保持するという利点があり、多くの関数型プログラミング関数で使用することができます。

lista_original = [5, 2, 8, 1, 3]
lista_ordenada = sorted(lista_original)
 
print(lista_original)  # Output: [5, 2, 8, 1, 3]
print(lista_ordenada)  # Output: [1, 2, 3, 5, 8]
 
lista_original.sort()
 
print(lista_original) # Output: [1, 2, 3, 5, 8]

7. Python のソートアルゴリズム: TimSort

最近のPythonでリストのソートに使われるデフォルトのソートアルゴリズムはTimSortです。 このアルゴリズムはTim Petersによって開発され、2002年に初めてPythonに導入されました。 それ以来、Javaや、AndroidやSwiftを含む他の多くのプログラミング言語やシステムで使用されています。

TimSortは、マージソートと挿入ソートを組み合わせたソートアルゴリズムである。 データの一部に対して挿入ソートを実行し、それをマージソートと組み合わせることで動作する。 これは、データの特定の部分がすでにソートされている場合に、非常に高速になるという利点がある。

TimSortの最悪の場合の時間複雑度は O(n log n)、既にソートされたリストに対する線形時間複雑度は O(n) である。

結論

この記事では、Pythonでのリストソートの基本について、主要な関数やアルゴリズムの使い方を含めて説明しました。 あなたの開発の助けになれば幸いです。

copyright for Python のリストソート: 説明と例

© 2023 All rights reserved.