Pythonのsorted()
で複数キーを指定して並び替える方法を説明します。
また、補足の説明としてソートキーにNone
が含まれる場合の対処法に関しても紹介します。
環境
- Python: 3.11.2
1つのキーを使ったソート
複数キーを指定したsorted()
の説明に入る前に、まずは1つのキーを使ったソートです。
下のコードでは、category_no
順に並び替えています。
item_list = [
{"id": 2, "category_no": 2},
{"id": 1, "category_no": 2},
{"id": 3, "category_no": 1},
]
sorted_item_list = sorted(item_list, key=lambda x: x["category_no"])
print(sorted_item_list)
# [{'id': 3, 'category_no': 1}, {'id': 2, 'category_no': 2}, {'id': 1, 'category_no': 2}]
複数キーを使ったソート
次に、本題の複数キーを使ってソートする場合です。
item_list = [
{"id": 2, "category_no": 2},
{"id": 1, "category_no": 2},
{"id": 3, "category_no": 1},
]
sorted_item_list = sorted(item_list, key=lambda x: (x["category_no"], x["id"]))
print(sorted_item_list)
# [{'id': 3, 'category_no': 1}, {'id': 1, 'category_no': 2}, {'id': 2, 'category_no': 2}]
↑ではkeyに複数の要素を指定していることが分かりますね。
また、1つのキーのソートと結果を比較すると、category_no
が同一の場合にはid
が若い番号が先に来ていることが分かります。
【補足】ソートキーにNoneがある場合
指定したキーにNoneが含まれる場合、実行するとエラー
もし、ソートで指定したキーにNone
が含まれている場合は以下のようにエラーが発生します。
以下では、最初の要素のcategory_no
をNone
にしています。
item_list = [
{"id": 2, "category_no": None},
{"id": 1, "category_no": 2},
{"id": 3, "category_no": 1},
]
sorted_item_list = sorted(item_list, key=lambda x: (x["category_no"], x["id"]))
print(sorted_item_list)
# TypeError: '<' not supported between instances of 'int' and 'NoneType'
Noneがあってもエラーにさせない
None
があってもエラーにならない方法を紹介します。
Noneを末尾にする
x["category_no"] is None
を指定することで、None
が末尾にきます。
↓ではエラーが出力されずソートされていることが分かります。
item_list = [
{"id": 2, "category_no": None},
{"id": 1, "category_no": 2},
{"id": 3, "category_no": 1},
]
sorted_item_list = sorted(
item_list, key=lambda x: (x["category_no"] is None, x["category_no"], x["id"])
)
print(sorted_item_list)
# [{'id': 3, 'category_no': 1}, {'id': 1, 'category_no': 2}, {'id': 2, 'category_no': None}]
Noneを先頭にする
x["category_no"] is not None
を指定することで、None
が先頭にきます。
item_list = [
{"id": 2, "category_no": None},
{"id": 1, "category_no": 2},
{"id": 3, "category_no": 1},
]
sorted_item_list = sorted(
item_list, key=lambda x: (x["category_no"] is not None, x["category_no"], x["id"])
)
print(sorted_item_list)
# [{'id': 2, 'category_no': None}, {'id': 3, 'category_no': 1}, {'id': 1, 'category_no': 2}]
まとめ
主に複数のキーを使ったソートについて説明し、None
が含まれる場合について補足で説明しました。
ぜひ参考にしてみてください!
コメント