Pythonで2つのリストの共通要素を求める方法:ラムダ式とfilter関数を使った実装例
この記事では、Pythonにおいてラムダ式とfilter関数を組み合わせて、2つの配列(リスト)の共通部分(積集合)を求める方法を解説します。
ここで扱う問題はシンプルです。「2つの配列が与えられたとき、両方に共通して含まれる要素をすべて見つけよ」というものです。集合演算のsetを使わずに、ラムダ式とfilter関数だけで実装する点がポイントになります。
アルゴリズムの流れ
処理の手順は以下の4ステップです。
- 2つの引数を受け取る共通部分(intersection)を求める関数を定義します。
- ラムダ式でインライン関数を作成し、filter関数と組み合わせることで、「その要素がもう片方のリストにも含まれているか」を判定しながら要素を選別します。
- 選別された共通要素を型変換(typecasting)によってリスト形式にまとめます。
- print文で結果を出力します。
実装例
それでは、実際のコードを見てみましょう。
def interSection(arr1, arr2): # 共通要素を求める関数
# filterメソッドとラムダ関数を使って一致する値を抽出
values = list(filter(lambda x: x in arr1, arr2))
print("Intersection of arr1 & arr2 is: ", values)
# ドライバープログラム
if __name__ == "__main__":
arr1 = ['t','u','t','o','r','i','a','l']
arr2 = ['p','o','i','n','t']
interSection(arr1, arr2)コードのポイント
lambda x: x in arr1の部分で、「arr2の各要素xがarr1にも存在するか」を真偽値で判定しています。filter()は判定がTrueになった要素だけを残すため、結果として両方のリストに含まれる要素のみが抽出されます。list()で囲むことで、filterオブジェクトを通常のリストに変換しています。
実行結果
Intersection of arr1 & arr2 is: ['o', 'i', 't']
arr1(tutorial)とarr2(point)の両方に含まれる文字「o」「i」「t」が正しく抽出されていることがわかります。
補足:setを使った代替手法
なお、順序や重複を気にしない場合は、set(arr1) & set(arr2)のようにset型の積集合演算を使うともっと簡潔に書けます。ただし、本記事のようにラムダ式とfilter関数を使う方法は、条件付きの抽出処理を汎用的に記述できるため、より複雑なフィルタリングにも応用できる点がメリットです。
まとめ
この記事では、Pythonでラムダ式とfilter関数を組み合わせることで、2つの配列の共通部分を効率的に求める方法を学びました。filter(lambda x: x in arr1, arr2)という一行で要素の選別が完結するのは、Pythonらしい簡潔な書き方と言えるでしょう。ぜひ自分のコードでも活用してみてください。
-
Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法
この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print
-
Pythonにおける「+=」と「=+」の違いとは?演算子の動作をわかりやすく解説
Pythonには見た目がよく似ているのに、まったく異なる動作をする演算子が存在します。その代表例が「+=」と「=+」です。この2つは一見同じように見えますが、実際には意味も役割も大きく違います。本記事では、それぞれの動作の仕組みと具体的な使い方を詳しく解説します。 「+=」は複合代入演算子(in-place演算) +=は、Pythonでは複合代入演算子と呼ばれるもので、内部的には object.__iadd__() メソッドへのシンタックスシュガー(糖衣構文)です。 公式ドキュメントには次のように記載されています。 これらのメソッドは、拡張された算術代入(+=、-=、*=、@=、/=、//=