Python のリストをソートするとき、リストの要素が数値とか文字列であれば、単純に sorted() や list.sort() メソッドを使いますが、要素がオブジェクトになるとそのままではソートができません。そんな時に key パラメータを使うとソートできるようになります。
いつも調べ直してしまうので、備忘録にまとめました。
下記の OS 環境で動作確認をしています。
RHEL 9.4 | x86_64 | |
Python | 3.12.1 | |
jupyterlab | 4.2.1 |
JupyterLab 上で確認しています。
まず、サンプル用に文字列を保持するだけのクラスを用意します。
class MyObject: def __init__(self, x: str): self.x = x
ソートを確認するためにリスト obj_list に MyObject のインスタンスを3つ要素に追加します。
obj_list = list() obj_list.append(MyObject('C')) obj_list.append(MyObject('A')) obj_list.append(MyObject('B')) [obj.x for obj in obj_list]
リスト obj_list の要素のオブジェクト(MyObject のインスタンス)が保持している文字列を順番に取り出してリストにすると以下のようになります。
['C', 'A', 'B']
リストの要素であるオブジェクトが保持している文字列をキーにしてソートするには、要素(この場合 MyObject のインスタンス)を引数にして、保持している文字列(obj.x)を返す関数を用意して、key パラメータにその関数を指定します。簡単な関数ですので、今回はラムダ式で無名関数にしています。
sorted() では次のようにします。
obj_list_2 = sorted(obj_list, key=lambda obj: obj.x) [obj.x for obj in obj_list_2]
['A', 'B', 'C']
list.sort() メソッドで元のリストをソートする場合は次のようにします。
obj_list.sort(key=lambda obj: obj.x) [obj.x for obj in obj_list]
['A', 'B', 'C']
参考サイト
- Sorting Techniques — Python ドキュメント
- Pythonでリストをソートするsortとsortedの違い | note.nkmk.me
- Pythonのlambda(ラムダ式、無名関数)の使い方 | note.nkmk.me
にほんブログ村
#オープンソース
0 件のコメント:
コメントを投稿