#21 Pythonで学ぶコレクション操作の応用(フィルタ・マップ的な考え方)の基本
はじめに
Pythonでリストや辞書を扱っていると、「条件に合うものだけ取り出したい」「全部の要素を加工したい」という場面によく出会います。今回はそんなときに便利な「フィルタ(filter)」と「マップ(map)」という考え方を紹介します。どちらも「コレクション(複数の値をまとめて持つデータ、リストや辞書など)の中身を、1件ずつループで書かなくても扱える」という共通点があります。覚えるとコードがぐっとすっきりします。
フィルタ的な考え方:条件に合うものだけ選ぶ
「フィルタ」とは、コレクションの中から条件に合う要素だけを選び出す操作のことです。たとえば「テストの点数リストから80点以上だけ取り出したい」というケースを考えてみます。
scores = [55, 82, 91, 40, 76, 88]
# for文で書く場合
passed = []
for s in scores:
if s >= 80:
passed.append(s)
# リスト内包表記で書く場合
passed = [s for s in scores if s >= 80]
print(passed) # [82, 91, 88]
Pythonにはfilter()という関数も用意されています。filter(条件を判定する関数, コレクション)という形で使い、条件に合う要素だけを残した結果を返します。
passed = list(filter(lambda s: s >= 80, scores))
ここで出てきたlambda(ラムダ)は、名前を付けずにその場限りで使う小さな関数を作る書き方です。lambda 引数: 戻り値の式という形になっており、「関数をわざわざdefで定義するほどでもない、ちょっとした処理」を書きたいときに使います。
マップ的な考え方:全部の要素を加工する
「マップ」とは、コレクションの全要素に同じ処理を適用して、新しいコレクションを作る操作です。たとえば全員の点数を10点加算したいときはこう書けます。
bonus_scores = [s + 10 for s in scores]
# または
bonus_scores = list(map(lambda s: s + 10, scores))
実務では、この2つを組み合わせて「条件に合うものだけを加工する」ことも多いです。内包表記なら1行で書けます。
result = [s + 10 for s in scores if s >= 80]
print(result) # [92, 101, 98]
他言語との違いと注意点
JavaScriptのArray.prototype.filterやmap、JavaのStream APIに慣れている人は、Pythonのfilter()・map()も同じ感覚で使えます。ただしPythonでは、リスト内包表記の方がPythonic(Pythonらしい書き方)とされ、実務のコードレビューでも好まれる傾向があります。filterやmapは結果そのものではなく「イテレータ」という、必要になったときに1つずつ値を取り出す仕組みのオブジェクトを返す点にも注意してください。中身をリストとして確認したい場合はlist()で囲む必要があります。これを忘れてprint(filter(...))のようにそのまま出力すると、値ではなく<filter object at 0x...>のようなメモリ上の場所を示す文字列が表示されます。これは初心者がよくつまずくポイントです。
また、辞書に対してもフィルタ・マップの考え方は使えます。
prices = {"apple": 100, "banana": 300, "grape": 500}
cheap = {k: v for k, v in prices.items() if v < 400}
print(cheap) # {'apple': 100, 'banana': 300}
このように{}を使う「辞書内包表記」もあり、リストと同じ発想でキーと値のペアを絞り込めます。データ量が非常に多い場合は、リストの代わりに丸カッコで囲む「ジェネレータ式」を使うと、必要な分だけ順番に計算するためメモリを節約できます。sum(s for s in scores if s >= 80)のように、関数の引数として直接渡せるのも便利な点です。
まとめ
今回はPythonのコレクション操作における「フィルタ」と「マップ」の考え方を紹介しました。for文でも同じことは書けますが、内包表記やfilter()・map()を使うと、コードの意図が「何を選んで、何をしたいか」という形でひと目で伝わりやすくなります。最初は内包表記の読み書きに慣れないかもしれませんが、短いコードから少しずつ試してみると、自然と使いこなせるようになるはずです。
関連記事
本ページはプロモーションを含みます。
参考書籍(PR)
Pythonをもっと学びたい方には「スッキリわかるPython入門 第2版」がおすすめです。
PR
コードを書かずに自動化したい方へ
「学んだけど自分の作業に組み込む時間がない」という方向けに、ダブルクリックで動く Windows専用の自動化ツールをオーダーメイドで作成しています。気になる方は こちらをご覧ください。
コメント
コメントを投稿