0
1

Python `operator.itemgetter`を使って複数のキーでソートする

Posted at

はじめに

Pythonでリストやタプルをソートする際、複数の条件に基づいてソートしたいことがあります。例えば、従業員のリストを年齢で昇順にソートし、同じ年齢の場合は給与で降順にソートするといったケースです。このような複雑なソートを簡単に実現する方法として、operator.itemgetter関数を使用する方法があります。

image.png

operator.itemgetterとは

operator.itemgetterは、Pythonの標準ライブラリoperatorモジュールに含まれる関数です。この関数は、与えられたインデックスやキーに基づいてオブジェクトから項目を取得する関数を返します。

image.png

基本的な使い方

まず、単一のキーでソートする基本的な例を見てみましょう。

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を使用しています。これは以下のように解釈されます:

  1. まず、各タプルの2番目の要素(インデックス1、年齢)でソート
  2. 年齢が同じ場合、3番目の要素(インデックス2、給与)でソート
  3. 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のソート機能と組み合わせることで、効率的で読みやすいコードを書くことができます。

ただし、複雑なソート条件を使用する際は、意図した結果が得られているか常に確認することが重要です。特に、負のインデックスの使用には注意が必要です。

image.png

参考リンク:

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1