sort()関数は、Pythonのリスト型に対してソートを行うための組み込み関数です。
データの整理や分析、アルゴリズムの実装などで頻繁に使用されます。
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(reverse=True) print(numbers) # [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
sort()関数のパラメータ
words = ['apple', 'Banana', 'orange', 'Grape'] words.sort(key=str.lower) print(words) # ['apple', 'Banana', 'Grape', 'orange'] words.sort(key=str.lower, reverse=True) print(words) # ['orange', 'Grape', 'Banana', 'apple']
安定ソートと不安定ソート
# 安定ソートの例 data = [('Alice', 2), ('Bob', 1), ('Charlie', 2), ('David', 1)] data.sort(key=lambda x: x[1]) print(data) # [('Bob', 1), ('David', 1), ('Alice', 2), ('Charlie', 2)] # 不安定ソートの例(一部の言語の実装に依存) data = [('Alice', 2), ('Bob', 1), ('Charlie', 2), ('David', 1)] data.sort(key=lambda x: x[1]) data.sort(key=lambda x: x[0]) print(data) # [('Alice', 2), ('Bob', 1), ('Charlie', 2), ('David', 1)]
この例では、最初のソートでは第2要素(数値)を基準にソートしています。
安定ソートでは、第2要素が等しい場合、元の順序が保持されます。
不安定ソートでは、第2要素が等しい場合、元の順序が保持されない可能性があります。
安定ソートと不安定ソートの違いは、同じ値を持つ要素の相対的な順序が保持されるかどうかです。
安定ソートの場合、第2要素が同じ値(1または2)の要素は、元の順序が保持されています。
つまり、(‘Bob’, 1)と(‘David’, 1)の順序、および(‘Alice’, 2)と(‘Charlie’, 2)の順序が維持されています。
不安定ソートの場合、第2要素が同じ値の要素の順序が変わる可能性があります。
たとえば、(‘Bob’, 1)と(‘David’, 1)の順序が入れ替わったり、(‘Alice’, 2)と(‘Charlie’, 2)の順序が入れ替わったりする可能性があります。
安定ソートは、ソートのキー以外の要素の順序を保持するため、マルチキーソートなどで有用です。
例えば、先にタプルの第2要素(数値)でソートし、次にタプルの第1要素(名前)でソートする場合、
安定ソートを使用すると、第2要素が同じ値の要素間の順序が保持されます。
ソートのパフォーマンス
import random import time # 大量のデータを生成 data = [random.randint(1, 1000) for _ in range(1000000)] # ソート前の時間を記録 start_time = time.time() # ソートを実行 data.sort() # ソート後の時間を記録 end_time = time.time() # 実行時間を計算 execution_time = end_time - start_time print(f"ソートにかかった時間: {execution_time:.2f}秒")
この例では、100万個のランダムな整数を生成し、sort()関数を使ってソートしています。
ソート前後の時間を記録し、実行時間を計算することで、ソートのパフォーマンスを測定しています。
実行時間は、コンピュータのスペックや他のプロセスの状態によって変動します。
大量のデータをソートする場合、パフォーマンスに注意が必要であることを示しています。
ちなみに、私の環境では以下の結果です。
ソートにかかった時間: 0.10秒
sorted()関数との違い
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers = sorted(numbers) print(numbers) # [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] print(sorted_numbers) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
実践的な使用例
# 数値データのソート scores = [90, 80, 95, 75, 85] scores.sort() print(scores) # [75, 80, 85, 90, 95] # 文字列データのソート names = ['Alice', 'Charlie', 'Bob'] names.sort() print(names) # ['Alice', 'Bob', 'Charlie'] # 辞書のvalueでソート fruits = {'apple': 3, 'banana': 1, 'orange': 2} sorted_fruits = sorted(fruits.items(), key=lambda x: x[1]) print(sorted_fruits) # [('banana', 1), ('orange', 2), ('apple', 3)] # 複数のキーを使ったソート people = [('Alice', 25), ('Bob', 30), ('Charlie', 30), ('Dave', 25)] people.sort(key=lambda x: (x[1], x[0])) print(people) # [('Alice', 25), ('Dave', 25), ('Bob', 30), ('Charlie', 30)]
よくある間違いと注意点
ソートを行う前に、リストが存在し、要素が適切な型であることを確認しましょう。
sort()関数はリストを直接変更するため、元のリストの順序は失われます。
必要に応じて、リストのコピーを作成してからソートを行いましょう。
まとめ
sort()関数は、Pythonのリストをソートするための強力な組み込み関数です。
keyパラメータを使ってカスタムソート関数を指定したり、reverseパラメータで降順ソートを行うことができます。
ソートのパフォーマンスに注意し、必要に応じてsorted()関数を使い分けましょう。