リストの中身をまとめて加工したり、条件に合う要素だけを取り出したりする処理は、Pythonのプログラミングで本当によく登場します。そんなとき「for文でループを回して、新しいリストに追加して…」と書くと、どうしてもコードが長くなりがちですよね。
そこで役立つのが map関数 と filter関数 です。この2つを使いこなせると、「全要素を変換する」「条件で絞り込む」といった処理を、たった1行でスッキリ書けるようになります。
この記事では、Python初心者の方に向けて、map関数とfilter関数の基本的な使い方から、2つを組み合わせるテクニック、リスト内包表記との使い分け、そしてつまずきやすい注意点までを、実際に動くコードと実行結果を示しながら丁寧に解説していきます。
コンテンツ
map関数とは?
map関数は、リストなどの各要素すべてに、同じ処理(関数)をまとめて適用するための組み込み関数です。「map(マップ)=対応づける」という名前のとおり、元の要素を一つひとつ別の値へ変換していくイメージですね。
基本の書き方は次のとおりです。
map(適用したい関数, 対象のリストなど)第1引数に「各要素へ行いたい処理」を関数として渡し、第2引数に「処理したいリスト」を渡します。ここで渡す関数は、名前のない使い捨ての関数であるラムダ式(lambda)で書くことが多いので、あわせて覚えておくと理解がスムーズになります。
map関数の基本的な使い方
リストの各要素を2倍にする
まずはシンプルに、リストのすべての要素を2倍にしてみましょう。
numbers = [1, 2, 3, 4, 5]
# 各要素を2倍にする
result = map(lambda x: x * 2, numbers)
print(list(result))
# 実行結果: [2, 4, 6, 8, 10]ここで1つ大切なポイントがあります。map関数が返すのはリストそのものではなく「map オブジェクト」と呼ばれるものです。そのため、中身を確認したり普通のリストとして使いたいときは、上のように list() で囲んでリストに変換してあげる必要があります。
自作の関数を渡す
ラムダ式だけでなく、def で定義した自分の関数を渡すこともできます。処理が複雑なときは、こちらのほうが読みやすくなります。
def to_celsius(f):
return (f - 32) * 5 / 9
fahrenheit = [32, 68, 104]
# 華氏を摂氏に変換する
celsius = map(to_celsius, fahrenheit)
print(list(celsius))
# 実行結果: [0.0, 20.0, 40.0]華氏の温度が入ったリストを、まとめて摂氏に変換できました。for文を書かずに、リスト全体へ一気に関数を適用できるのがmap関数の魅力です。
複数のリストを同時に処理する
map関数には、リストを複数渡すこともできます。その場合は、それぞれのリストから同じ位置の要素を取り出して関数に渡してくれます。複数のリストを同時に扱うという意味ではzip関数と似ていますが、mapは同時に変換までしてくれるのが特徴です。
a = [1, 2, 3]
b = [10, 20, 30]
# 2つのリストの要素を足し合わせる
result = map(lambda x, y: x + y, a, b)
print(list(result))
# 実行結果: [11, 22, 33]filter関数とは?
filter関数は、リストなどの要素の中から、条件に合うものだけを取り出す(絞り込む)ための組み込み関数です。「filter(フィルター)=ろ過する」という名前のとおり、条件というフィルターを通して、必要な要素だけを残すイメージです。
基本の書き方は次のとおりです。
filter(条件を判定する関数, 対象のリストなど)第1引数には、要素を1つ受け取って True か False を返す関数を渡します。判定の結果が True になった要素だけが残る、というのがfilterの仕組みです。
filter関数の基本的な使い方
偶数だけを取り出す
リストの中から偶数だけを取り出してみましょう。2で割った余りが0なら偶数、という条件で判定します。
numbers = [1, 2, 3, 4, 5, 6]
# 偶数(2で割り切れる数)だけを取り出す
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result))
# 実行結果: [2, 4, 6]map関数と同じく、filter関数が返すのも「filter オブジェクト」です。中身を確認するときは list() でリストに変換しましょう。
空文字や0を取り除く(第1引数に None)
filter関数の第1引数に、関数ではなく None を渡すと、「それ自体が偽(False扱い)となる要素」を自動的に取り除いてくれます。空文字や0、空のリストなどを一気に掃除したいときに便利です。
words = ["apple", "", "banana", "", "cherry"]
# 空文字を取り除く
result = filter(None, words)
print(list(result))
# 実行結果: ['apple', 'banana', 'cherry']map関数とfilter関数を組み合わせる
map関数とfilter関数は、組み合わせて使うこともできます。たとえば「偶数だけを取り出して、さらにそれを2乗する」という処理は、次のように書けます。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数だけを取り出して(filter)、それぞれを2乗する(map)
result = map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, numbers))
print(list(result))
# 実行結果: [4, 16, 36, 64, 100]内側の filter で偶数(2, 4, 6, 8, 10)に絞り込み、その結果を外側の map で2乗しています。ネスト(入れ子)になっていて少し読みにくいので、実際のコードでは処理ごとに変数に分けて書くと、より分かりやすくなります。
リスト内包表記との使い分け
ここまで読んで「あれ、これってリスト内包表記でも同じことができるのでは?」と気づいた方もいるかもしれません。そのとおりで、map関数とfilter関数の処理は、リスト内包表記でも書けます。
numbers = [1, 2, 3, 4, 5, 6]
# map / filter を使った書き方
result1 = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))
# リスト内包表記を使った書き方
result2 = [x * 2 for x in numbers if x % 2 == 0]
print(result1) # [4, 8, 12]
print(result2) # [4, 8, 12]どちらを使っても結果は同じです。一般的に、Pythonでは「シンプルで読みやすい」という理由から、リスト内包表記のほうが好まれる場面が多くなっています。一方で、すでに定義済みの関数をそのまま適用したいときは、map関数を使うとスッキリ書けることもあります。まずは両方の書き方を知っておき、状況に応じて読みやすいほうを選べるようにしておくと安心です。
map・filterを使うときの注意点
最後に、初心者の方がつまずきやすいポイントを1つ紹介します。map関数やfilter関数が返すオブジェクトは「イテレータ」と呼ばれるもので、一度中身を取り出すと、2回目は空になってしまうという性質があります。
numbers = [1, 2, 3]
result = map(lambda x: x * 2, numbers)
print(list(result)) # [2, 4, 6]
print(list(result)) # [] ← 2回目は空になる!このように、同じ result を2回 list() で取り出すと、2回目は空のリストになってしまいます。結果を何度も使い回したいときは、最初に list() でリストへ変換して変数に入れておくのがおすすめです。
もっと効率的にPythonを学びたい人へ
map関数やfilter関数のように、Pythonには「知っていると一気に世界が広がる」便利な機能がたくさんあります。とはいえ、独学だけで進めていると「この書き方で合っているのかな?」「もっと良いやり方があるのでは?」と、つまずいたり不安になったりすることも多いですよね。
そんなときは、プロの講師にマンツーマンで教えてもらえるプログラミングスクールを活用するのも一つの手です。未経験からPythonを習得したい方や、エンジニアへの転職を目指す方に向けて、転職サポートまで用意されているスクールもあります。まずは無料カウンセリングで、自分に合った学び方を相談してみるとイメージがつかみやすいですよ。
※本記事には広告(アフィリエイトリンク)を含みます。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
まとめ
今回は、Pythonのmap関数とfilter関数について解説しました。最後に要点を振り返っておきましょう。
- map関数は、リストなどの各要素すべてに同じ処理をまとめて適用する関数
- filter関数は、条件に合う要素だけを取り出して絞り込む関数
- どちらも返り値はリストではないので、
list()でリストに変換して使う - map と filter は組み合わせて「絞り込み+変換」もできる
- 同じ処理はリスト内包表記でも書けるので、読みやすいほうを選ぶとよい
- 返り値のイテレータは一度取り出すと空になるため、使い回すときは先にリスト化しておく
map関数とfilter関数を使いこなせると、ループ処理をより短く、読みやすく書けるようになります。ぜひ手元のコードで実際に動かして、感覚をつかんでみてくださいね。
ナノトイラボ 