Pythonの整列(ソート)処理: sort() と sorted()の違い

Pythonでは、リストやタプルなどのシーケンスオブジェクトを整列(ソート)するために、2つの主要な関数、sort()とsorted()があります。sort()メソッドは、元のリスト自体を変更して整列します。これに対して、sorted()関数は、元のリストを変更せずに新しいリストを返します。この記事では、これら2つの関数の違いについてより詳しく説明します。

sort() 関数

sort()関数は、リストオブジェクトに対して使用されます。この関数は、元のリストを直接変更し、ソートされたリストを返しません。sort()を呼び出すことで、リストの項目が昇順に並べ替えられ、元のリストが変更されます。

例えば、以下のように使用します。

>>> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
>>> numbers.sort()
>>> print(numbers)
[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

この例では、リスト numbers を昇順にソートし、元のリストが変更されたため、sort()関数による返り値はありません。

sort()関数には、追加の引数を指定することで、逆順ソートやカスタムソートの方法を指定できます。たとえば、以下のコードでは、降順にソートすることができます。

>>> numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
>>> numbers.sort(reverse=True)
>>> print(numbers)
[9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]

この場合、reverse=True引数を指定することで、リストが降順にソートされます。

重要なポイントは、sort()関数はリストオブジェクトを直接変更するため、リスト以外のシーケンスオブジェクトでsort()関数を使用することはできません。たとえば、タプルオブジェクトは変更不可能であるため、sort()関数を使用することはできません。

sorted() 関数

sorted() 関数は、リスト以外のイテラブルオブジェクトにも使用できるため、より柔軟に使用できます。また、sorted() 関数は元のオブジェクトを変更せず、新しいリストを作成します。

sorted() 関数は、引数にソートするオブジェクトを指定します。そして、指定されたオブジェクトの要素を昇順にソートした新しいリストを返します。以下の例では、文字列とタプルに対して sorted() 関数を使用しています。

>>> s = "hello world"
>>> t = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)
>>> u = sorted(s)
>>> v = sorted(t)
>>> print(u)
[' ', 'd', 'e', 'h', 'l', 'l', 'o', 'o', 'r', 'w']
>>> print(v)
[1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

上記のコードでは、文字列 'hello world' とタプル (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5) を sorted() 関数でソートし、新しいリスト u と v を作成しています。sorted() 関数によって、オリジナルの文字列とタプルは変更されず、新しいリストがソートされた結果を持っています。

また、sorted() 関数は、リストやタプルのようなイテラブルオブジェクトだけでなく、辞書やセットのような一部のオブジェクトにも適用できます。ただし、これらのオブジェクトは要素を持つ順序がないため、ソートの結果が予測不能な場合があります。

pydocument.hatenablog.com

違いを明確にするための実例

以下は、sort() と sorted() の違いをより詳しく説明した例です。

>>> x = [('John', 20), ('Emily', 25), ('Tim', 22), ('Jane', 18)]
>>> x.sort()
>>> print(x)
[('Emily', 25), ('Jane', 18), ('John', 20), ('Tim', 22)]

上記のコードでは、リスト x にタプルが含まれており、リスト自体を sort() 関数でソートしています。しかし、タプルの2番目の要素に基づいてソートしていません。sort() 関数は、オブジェクト自体を変更するため、オリジナルのリスト x がソートされ、返り値はありません。

>>> x = [('John', 20), ('Emily', 25), ('Tim', 22), ('Jane', 18)]
>>> y = sorted(x, key=lambda i: i[1])
>>> print(x)
[('John', 20), ('Emily', 25), ('Tim', 22), ('Jane', 18)]
>>> print(y)
[('Jane', 18), ('John', 20), ('Tim', 22), ('Emily', 25)]

上記のコードでは、sorted() 関数を使用して、リスト x をタプルの2番目の要素に基づいてソートしています。しかし、sorted() 関数は、オブジェクトを変更するのではなく、新しいリスト y を作成します。この新しいリスト y は、オリジナルのリスト x とは別のものであり、ソートされたタプルを含んでいます。

上記の例からわかるように、sort() 関数はリストオブジェクトにしか使えず、オブジェクト自体を変更するのに対して、sorted() 関数は任意のイテラブルオブジェクトに使用でき、新しいリストを作成する点が異なります。これらの違いを理解し、使用する際には、適切な関数を選択する必要があります。

key引数を使用して整列基準をカスタマイズする

sort() メソッドと sorted() 関数は、オプションの引数を使用して整列基準をカスタマイズすることができます。 key 引数を使うと、オブジェクトの特定の値に基づいて整列することができます。以下の例を見てみましょう。

fruits = ["banana", "apple", "cherry", "date", "elderberry"]

# key 引数を使用して果物を長さの順に整列する
sorted_fruits = sorted(fruits, key=lambda x: len(x))
print(sorted_fruits) # 出力: ['date', 'apple', 'banana', 'cherry', 'elderberry']

# sort() メソッドによる果物の整列
fruits.sort(key=lambda x: len(x))
print(fruits) # 出力: ['date', 'apple', 'banana', 'cherry', 'elderberry']

上記の例では、 key 引数を使用して、果物を長さの順に整列しています。 lambda 関数を使って各果物の長さを計算し、それを整列の基準に使用しています。こうすることで、長さの異なる果物を正しい順序で整列することができます。

sort()とsorted()のパフォーマンスの違い

sort() メソッドと sorted() 関数の違いには、パフォーマンスの面で異なる点があります。sort() メソッドは元のリストを直接変更するため、リソースの効率的な使用を提供します。一方、sorted() 関数は新しいリストを返すため、より大きなメモリ使用を必要とすることがあります。そのため、要素数が多い場合やパフォーマンスが重要な場合は、sort() メソッドを使用することが推奨されます。

まとめ

以上のように、sort() メソッドと sorted() 関数の違いについて、具体例とコードを示しました。どちらの方法を使用するかは状況によって異なりますが、適切に使用することでプログラムのパフォーマンスを改善することができます。これらのプログラムはPythonの基本的な文法で実装することができます。Pythonの基礎学習には下記のようなサイトの利用が有効です。

click.linksynergy.com

click.linksynergy.com