Python sorted()とsort()によるリストの並べ替え

今回は、Pythonでリストをソートする複数の方法を検証します。

Pythonにはリストや他の反復処理可能なオブジェクトをソートするための2つのメソッドが組み込まれています。

特定のユースケースで選択されるメソッドは、リストをインプレースでソートしたいのか、ソートされたリストの新しいバージョンを返したいのかに依存することがよくあります。

リストをその場でソートしたいと仮定すると、以下のように list.sort() メソッドを使用することができます。

>>> pets = ['Turtle', 'Cat', 'Fish', 'Dingo']
>>> pets.sort()
>>> pets
['Cat', 'Dingo', 'Fish', 'Turtle']


デフォルトでは、リストは昇順にソートされます。

sortメソッドが呼ばれた後、元のペットリストがどのように変更されるかに注目してください。

このようなことが起こらないようにするには、組み込みの sorted() 関数を使用して、元のリストを変更しないまま新しいソートされたリストを返すことができます。

>>> pets = ['Turtle', 'Cat', 'Fish', 'Dingo']
>>> new_pets = sorted(pets)
>>> new_pets
['Cat', 'Dingo', 'Fish', 'Turtle']
>>> pets
['Turtle', 'Cat', 'Fish', 'Dingo']


逆引数は、リストを降順にソートするために使うことができます。

>>> pets = ['Turtle', 'Cat', 'Fish', 'Dingo']
>>> new_pets = sorted(pets, reverse=True)
>>> new_pets
['Turtle', 'Fish', 'Dingo', 'Cat']
>>> pets.sort(reverse=True)
>>> pets
['Turtle', 'Fish', 'Dingo', 'Cat']


しかし、私たちが定義した独自の基準に基づいてリストをソートしたい場合もあります。

例えば、ペットのリストを各エントリーの長さによってソートしたい場合があります。

このような場合、Pythonはkey引数を提供し、ソート基準を指定するためのユーザー定義関数を受け取ります。

>>> pets = ['Turtle', 'Cat', 'Fish', 'Dingo']
>>> get_len(x):
...    return len(x)
...
>>> new_pets = sorted(pets, key=get_len)
>>> new_pets
['Cat', 'Fish', 'Dingo', 'Turtle']
>>> pets.sort(key=get_len)
>>> pets
['Cat', 'Fish', 'Dingo', 'Turtle']


次に、もう少し複雑な例を考えてみましょう。

ここでは、あるグループの人々のデータを含む辞書のリストがあり、人々の年齢に基づいてリストを降順でソートしたいと思います。

これを行うには、 keyreverse キーワード引数、そして Python のラムダ関数を使用します。

こうすることで、事前に定義する代わりに、その場でソート関数を作成することができます。

>>> data = [ { 'name': 'Billy', 'age': 26, 'country': 'USA' }, { 'name': 'Timmy', 'age': 5, 'country': 'Australia' }, { 'name': 'Sally', 'age': 19, 'country': 'Costa Rica' }, { 'name': 'Tommy', 'age': 67, 'country': 'Serbia' } ]
>>> new_data = sorted(data, key=lambda x: x['age'], reverse=True)
>>> new_data
[{'country': 'Serbia', 'age': 67, 'name': 'Tommy'}, {'country': 'USA', 'age': 26, 'name': 'Billy'}, {'country': 'Costa Rica', 'age': 19, 'name': 'Sally'}, {'country': 'Australia', 'age': 5, 'name': 'Timmy'}]
>>> data.sort(key=lambda x: x['age'], reverse=True)
>>> data
[{'country': 'Serbia', 'age': 67, 'name': 'Tommy'}, {'country': 'USA', 'age': 26, 'name': 'Billy'}, {'country': 'Costa Rica', 'age': 19, 'name': 'Sally'}, {'country': 'Australia', 'age': 5, 'name': 'Timmy'}]


辞書が一見ランダムな順番で始まり、最終的にリストの中で最も古い人が最初で最も若い人が最後になっていることに注目してください。

このようにソート関数とラムダを使うことで、複雑なデータ構造も1行のコードで簡単にソートすることができます。

また、 reverse=True を設定することで、ソートの順序を降順にすることができます。

著者について

この記事は、コードを通じて人々の生活を向上させることに情熱を注ぐソフトウェアコンサルタント兼開発者のJacob Stopakによって書かれました。

JacobはCode Cardの作者で、一般的なコードスニペットを検索、コピー、ペーストするための開発者向けの便利なツールです。

タイトルとURLをコピーしました