2019年5月2日

operator.itemgetter

operatorライブラリで定義されている operator.itemgetter を紹介します。


operator.itemgetter は、list や dict の要素を取得するための関数を提供します。
具体的な使用例は以下のようになります。

>>> from operator import itemgetter

>>> t = ('Python', 1990, 'Guido')
>>> itemgetter(0)(t)
'Python'
>>> itemgetter(1)(t)
1990
>>> itemgetter(2)(t)
'Guido'

>>> d = {'name': 'Python', 'release': 1990, 'designed by': 'Guido'}
>>> itemgetter('name')(d)
'Python'
>>> itemgetter('release')(d)
1990
>>> itemgetter('designed by')(d)
'Guido'
上の例だけ見ても特に使い道がないように思えますが、実際に operator.itemgetter の使い所となるのは、ずばり lambda の代わりです。


例として、sorted() に key を指定する方法を示します。
tuple の2番目の要素でソートをする、という場合、代表的なやり方として、operator.itemgetter を使うやり方と、lambda を使うやり方があります。

>>> from operator import itemgetter

>>> t = (('Python', 1990, 'Guido'), ('Ruby', 1995, 'Matz'), ('Perl', 1987, 'Larry'))

# sorted の key を itemgetter で指定
>>> sorted(t, key=itemgetter(1))
[('Perl', 1987, 'Larry'), ('Python', 1990, 'Guido'), ('Ruby', 1995, 'Matz')]

# sorted の key を lambda で指定
>>> sorted(t, key=lambda x: x[1])
[('Perl', 1987, 'Larry'), ('Python', 1990, 'Guido'), ('Ruby', 1995, 'Matz')]
どちらのやり方でも、タイプ量、可読性ともに大差はありませんが、動作速度は operator.itemgetter の方が若干早いので、operator.itemgetter の使用が推奨されます。




なお、operatorライブラリには、itemgetter の兄弟版とでも言うべき、attrgetter も用意されています。

0 件のコメント:

コメントを投稿