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]]
この記事が気に入ったらサポートをしてみませんか?