Pythonのリストには、リストをその場で変更する組み込みのlist.sort()
メソッドがあります。また、イテラブルから新しいソートされたリストを作成する組み込みのsorted()
関数もあります。
ソートの基本
簡単な昇順のソートは非常に簡単です。sorted()
関数を呼び出すだけです。新しいソートされたリストを返します。
sorted([5, 2, 3, 1, 4]) # [1, 2, 3, 4, 5]
list.sort()
メソッドも使用できます。リストをその場で変更します(そして混乱を避けるためにNoneを返します)。通常、sorted()
よりも便利ではありませんが、元のリストが必要ない場合は、わずかに効率的です。
a = [5, 2, 3, 1, 4]
a.sort()
print(a) # [1, 2, 3, 4, 5]
list.sort()
メソッドはリストでのみ定義されています。対照的に、sorted()
関数は任意のイテラブルを受け入れます。
sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}) # [1, 2, 3, 4, 5]
キー関数
list.sort()
とsorted()
の両方には、比較を行う前に各リスト要素に対して呼び出される関数(または他の呼び出し可能なもの)を指定するキーパラメータがあります。例えば、大文字小文字を区別しない文字列の比較です。
sorted("This is a test string from Andrew".split(), key=str.casefold)
# ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
キーパラメータの値は、ソートの目的で使用するキーを返す関数(または他の呼び出し可能なもの)であるべきです。このテクニックは高速です。なぜなら、キー関数は各入力レコードに対して正確に一度だけ呼び出されるからです。一般的なパターンは、オブジェクトのインデックスの一部をキーとして使用して複雑なオブジェクトをソートすることです。
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
sorted(student_tuples, key=lambda student: student[2]) # sort by age
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
同じテクニックは、名前付き属性を持つオブジェクトにも適用できます。
class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name, self.grade, self.age))
student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
sorted(student_objects, key=lambda student: student.age) # sort by age
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
名前付き属性を持つオブジェクトは、上記のような通常のクラスによって作成できるだけでなく、データクラスまたは名前付きタプルのインスタンスにすることもできます。
オペレータモジュール関数と部分関数評価
上記で示したキー関数のパターンは非常に一般的なので、Pythonはアクセサ関数をより簡単かつ高速にするための便利な関数を提供しています。operator
モジュールにはitemgetter()
, attrgetter()
, およびmethodcaller()
関数があります。これらの関数を使用すると、上記の例はよりシンプルで高速になります。
from operator import itemgetter, attrgetter
sorted(student_tuples, key=itemgetter(2))
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
sorted(student_objects, key=attrgetter('age'))
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
以上、Pythonのリストソートについての基本的な情報を提供しました。これらのテクニックを使用すると、Pythonのリストを効率的にソートすることができます。さらに詳しい情報は、Pythonの公式ドキュメンテーションを参照してください。