はじめに
Pythonでリストやタプルをソートする際、複数の条件に基づいてソートしたいことがあります。例えば、従業員のリストを年齢で昇順にソートし、同じ年齢の場合は給与で降順にソートするといったケースです。このような複雑なソートを簡単に実現する方法として、operator.itemgetter
関数を使用する方法があります。
operator.itemgetter
とは
operator.itemgetter
は、Pythonの標準ライブラリoperator
モジュールに含まれる関数です。この関数は、与えられたインデックスやキーに基づいてオブジェクトから項目を取得する関数を返します。
基本的な使い方
まず、単一のキーでソートする基本的な例を見てみましょう。
from operator import itemgetter
# 名前と年齢のタプルのリスト
people = [('Alice', 25), ('Bob', 30), ('Charlie', 22)]
# 年齢でソート
sorted_people = sorted(people, key=itemgetter(1))
print(sorted_people)
# 出力: [('Charlie', 22), ('Alice', 25), ('Bob', 30)]
この例では、itemgetter(1)
を使って各タプルの2番目の要素(年齢)に基づいてソートしています。
複数のキーでソートする
itemgetter
の真価は、複数のキーでソートする際に発揮されます。
from operator import itemgetter
# 名前、年齢、給与のタプルのリスト
employees = [
('Alice', 30, 50000),
('Bob', 25, 60000),
('Charlie', 30, 55000),
('David', 25, 55000)
]
# 年齢で昇順、給与で降順にソート
sorted_employees = sorted(employees, key=itemgetter(1, 2), reverse=True)
print(sorted_employees)
# 出力: [('Charlie', 30, 55000), ('Alice', 30, 50000), ('Bob', 25, 60000), ('David', 25, 55000)]
この例では、itemgetter(1, 2)
とreverse=True
を使用しています。これは以下のように解釈されます:
- まず、各タプルの2番目の要素(インデックス1、年齢)でソート
- 年齢が同じ場合、3番目の要素(インデックス2、給与)でソート
-
reverse=True
を指定することで、全体を降順にソート
結果として:
- Charlieが最初(30歳で高い給与)
- Aliceが次(30歳で低い給与)
- Bobが3番目(25歳で最高給与)
- Davidが最後(25歳で低い給与)
注意:itemgetter(1, -2)
のような負のインデックスを使用すると、予期せぬ結果になる可能性があります。代わりに、明示的なインデックスを使用することをお勧めします。
辞書のリストでの使用
itemgetter
は辞書のリストをソートする際にも非常に便利です。
from operator import itemgetter
books = [
{'title': 'Python入門', 'author': '山田太郎', 'year': 2020},
{'title': 'データ分析実践', 'author': '佐藤花子', 'year': 2019},
{'title': '機械学習の基礎', 'author': '田中次郎', 'year': 2020}
]
# 出版年で昇順、タイトルでソート
sorted_books = sorted(books, key=itemgetter('year', 'title'))
for book in sorted_books:
print(f"{book['year']} - {book['title']} by {book['author']}")
# 出力:
# 2019 - データ分析実践 by 佐藤花子
# 2020 - 機械学習の基礎 by 田中次郎
# 2020 - Python入門 by 山田太郎
この例では、まず出版年で昇順にソートし、同じ年の本はタイトルのアルファベット順でソートしています。
まとめ
operator.itemgetter
を使用することで、複雑なソート条件を簡潔に記述できます。これは特に、大量のデータを扱う際や、ソート条件が動的に変更される可能性がある場合に非常に有用です。Pythonのソート機能と組み合わせることで、効率的で読みやすいコードを書くことができます。
ただし、複雑なソート条件を使用する際は、意図した結果が得られているか常に確認することが重要です。特に、負のインデックスの使用には注意が必要です。