PR

【Python】sorted()で複数キーを指定して並び替える

Python
記事内に広告が含まれています。

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_noNoneにしています。

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が含まれる場合について補足で説明しました。
ぜひ参考にしてみてください!

コメント

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