Python operatorモジュール徹底活用!itemgetterなどで処理を簡潔に
この記事では、Pythonの標準ライブラリ**operatorモジュールの便利な使い方について解説します。特にitemgetter、attrgetter、methodcaller**などの関数は、ソートやデータの抽出といった繰り返し処理を、より簡潔かつ効率的に記述するのに役立ちます。関数型プログラミングのスタイルを取り入れたい方や、可読性の高いコードを目指す方におすすめです。
operatorモジュールとは?
operatorモジュールは、Pythonの組み込み演算子(+, -, *, ==など)に対応する関数を提供します。これらの関数は、通常の演算子よりも柔軟な使い方を可能にし、特に高階関数(sorted(), map(), filter()など)と組み合わせることで、コードをより簡潔に記述できます。
なぜoperatorモジュールを使うのか?
-
コードの簡潔化: ラムダ式(
lambda)を使う代わりに、より読みやすい方法で特定の操作を表現できます。 -
パフォーマンスの向上: C言語で実装されているため、同等のラムダ式よりも高速に動作する場合があります。
-
可読性の向上: 組み込み演算子に対応する関数名を使うことで、コードの意図がより明確になります。
itemgetterで要素を抽出・ソート
itemgetterは、リストやタプル、辞書などのインデックスやキーを指定して要素を取得するための関数です。特にsorted()関数のkey引数で威力を発揮します。
基本的な使い方
インデックスやキーを指定して要素を抽出します。
from operator import itemgetter
data = [('Alice', 25, 'Engineer'), ('Bob', 30, 'Doctor'), ('Charlie', 22, 'Student')]
# 1番目の要素(年齢)を取得
get_age = itemgetter(1)
print(get_age(data[0])) # 25
# 0番目(名前)と2番目(職業)の要素を同時に取得
get_name_job = itemgetter(0, 2)
print(get_name_job(data[1])) # ('Bob', 'Doctor')
sorted()のkeyに使う例
リスト内のタプルや辞書を特定の要素でソートする際に非常に便利です。
from operator import itemgetter
users = [
{'name': 'Alice', 'age': 30},
{'name': 'Bob', 'age': 25},
{'name': 'Charlie', 'age': 35}
]
# 年齢でソート
sorted_by_age = sorted(users, key=itemgetter('age'))
print(sorted_by_age)
# [{'name': 'Bob', 'age': 25}, {'name': 'Alice', 'age': 30}, {'name': 'Charlie', 'age': 35}]
# 複数のキーでソート (例: 年齢の降順、名前の昇順)
# sorted()は安定ソートなので、先に名前でソートし、その結果を年齢でソートすることで複数キーソートを実現
sorted_multi_key = sorted(sorted(users, key=itemgetter('name')), key=itemgetter('age'), reverse=True)
print(sorted_multi_key)
# [{'name': 'Charlie', 'age': 35}, {'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}]
ラムダ式で書く場合と比較して、itemgetter('age')の方が意図が明確で簡潔です。
attrgetterで属性を抽出・ソート
attrgetterは、オブジェクトの属性を指定して値を取得するための関数です。クラスのインスタンスを特定の属性でソートする際などに役立ちます。
基本的な使い方
オブジェクトの属性を取得します。
from operator import attrgetter
class Person:
def __init__(self, name, score):
self.name = name
self.score = score
people = [Person('Alice', 85), Person('Bob', 92), Person('Charlie', 78)]
# score属性を取得
get_score = attrgetter('score')
print(get_score(people[0])) # 85
sorted()のkeyに使う例
オブジェクトのリストを特定の属性値でソートします。
from operator import attrgetter
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
products = [
Product('Laptop', 1200),
Product('Mouse', 25),
Product('Keyboard', 75)
]
# price属性でソート
sorted_by_price = sorted(products, key=attrgetter('price'))
for p in sorted_by_price:
print(f"{p.name}: {p.price}")
# Mouse: 25
# Keyboard: 75
# Laptop: 1200
methodcallerでメソッドを呼び出す
methodcallerは、オブジェクトの特定のメソッドを引数付きで呼び出すための関数を生成します。
基本的な使い方
オブジェクトのメソッドを呼び出します。
from operator import methodcaller
class Greeter:
def greet(self, message):
return f"Hello, {message}!"
g = Greeter()
# 'greet'メソッドを呼び出す関数を生成
call_greet = methodcaller('greet', 'World')
print(call_greet(g)) # Hello, World!
# 複数の引数を渡す例
class Calculator:
def add(self, a, b):
return a + b
calc = Calculator()
call_add = methodcaller('add', 5, 3)
print(call_add(calc)) # 8
その他の便利な関数
operatorモジュールには他にも多くの便利な関数があります。
-
add(a, b):a + bと同じ -
sub(a, b):a - bと同じ -
mul(a, b):a * bと同じ -
eq(a, b):a == bと同じ -
lt(a, b):a < bと同じ -
not_(obj):not objと同じ
これらの関数も、map()やfilter()などと組み合わせることで、ラムダ式を減らし、コードを簡潔にできます。
from operator import add, mul
numbers = [1, 2, 3]
# 各要素に10を足す
added_10 = list(map(lambda x: add(x, 10), numbers)) # ラムダ式とaddの組み合わせ
print(added_10) # [11, 12, 13]
# 各要素を2倍する
doubled = list(map(mul, numbers, [2]*len(numbers))) # mulとmapの組み合わせ
print(doubled) # [2, 4, 6]
まとめ
Pythonのoperatorモジュールは、特にitemgetter、attrgetter、methodcallerを通じて、データの抽出、ソート、メソッド呼び出しといった一般的な操作を、より簡潔で可読性の高い方法で実現します。ラムダ式の代わりにこれらの関数を使うことで、パフォーマンスの向上も期待できます。ぜひoperatorモジュールを活用して、あなたのPythonコードをより洗練されたものにしてください!
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座




