見出し画像

Python における ソート

1. リスト型のsort()メソッド

■ 1.1 基本的使い方 sort()

sort()メソッドは,リストの中身を書き換えてしまいます.
これは破壊的と呼ばれます.

a = [2,5,1,3]
print(a)
a.sort()
print(a)
実行結果
[2, 5, 1, 3]
[1, 2, 3, 5]

正しく ソート(昇順)できていることが分かります.

■ 1.2 逆順(降順)でソート

a = [2,5,1,3]
print(a)
a.sort(reverse=True)
print(a)
実行結果
[2, 5, 1, 3]
[5, 3, 2, 1]

正しく,降順ソートされていることが分かる.

■ 1.3 sort() の戻り値

sort() の戻り値は None です.「ソート済みのリスト」ではありません.

a= [2,5,1,3]
print(a)
print(a.sort())
print(a)
実行結果
[2, 5, 1, 3]
None
[1, 2, 3, 5]

print(a.sort()) の出力は None になっています.

2. 組み込み関数 sorted()

■ 2.1 基本的使い方 sorted()

注意:sorted() は「リスト型のメソッド」ではなく「組み込み関数」です。
使い方は、a.sorted() ではなく、 sorted( a ) です。

a = [2,5,1,3]
print(a)
print(sorted(a))
print(a)
実行方法
[2, 5, 1, 3]
[1, 2, 3, 5]
[2, 5, 1, 3]

sorted(a) の戻り値が「ソート済みのリスト」になっていることが分かります。
一方で、sorted(a) の実行後も、リストaの中身は変わっておらず、ソート前の[2,5,1,3]になっていることが分かります。非破壊的です。

3. 評価方法をkeyで指定する

[2,3], [3,2], [1,5], [5,1] の4要素をソートしますが、[x, y]は, x**y (xのy乗)と考えて、x**yが小さい順にソートしたいとします。
例えば [1,5] が 1**5 =1 で最も小さい。

■ 3.1 ラムダ式を使わない方法 (関数を使う)

評価用関数 evalFn を作って、sort( key=evalFn )と書いて「evalFnを使って各要素を評価する」と指定してソートする。

def evalFn(x):
       return x[0] ** x[1]

a = [ [2,3], [3,2], [1,5], [5,1] ]
print(a)
a.sort(key=evalFn)
print(a)
実行結果
[[2, 3], [3, 2], [1, 5], [5, 1]]
[[1, 5], [5, 1], [2, 3], [3, 2]]

正しくソートされている。

■ 3.2 ラムダ式を使う

評価方法のkeyとして、ラムダ式を書いています。
lambda x: x[0]**x[1]
がラムダ式です。ラムダ式は簡潔に書けるのが利点ですが、分からなければ関数を定義して使えば問題ないです。

a = [ [2,3], [3,2], [1,5], [5,1] ]
print(a)
a.sort(key=lambda x: x[0]**x[1])
print(a)
実行結果
[[2, 3], [3, 2], [1, 5], [5, 1]]
[[1, 5], [5, 1], [2, 3], [3, 2]]

この記事が気に入ったらサポートをしてみませんか?