Pythonでネストされたリストの共通部分を求める2つの方法
この記事では、複数のリストを含む2つのリスト(ネストされたリスト)から共通部分を抽出する方法を、いくつかのアプローチに分けて解説します。まずは伝統的な方法から見ていきましょう。
方法1:リスト内包表記を使う
以下の手順で問題を解決します。
- 複数のリストを含む2つのリストを初期化する
- 1つ目のリストを反復処理し、現在の要素が2つ目のリストにも存在する場合に新しいリストへ追加する
- 結果を出力する
サンプルコード
# リストの初期化 list_1 = [[1, 2], [3, 4], [5, 6]] list_2 = [[3, 4]] # 両方のリストに共通する要素を見つける result = [sub_list for sub_list in list_1 if sub_list in list_2] # 結果の出力 print(result)
上記のコードを実行すると、次のような結果が得られます。
実行結果
[[3, 4]]
リスト内包表記を使うことで、たった1行で共通部分を抽出できるのがポイントです。コードがシンプルで可読性が高いため、小規模なデータには最適な方法といえます。
方法2:set(集合)を使う
次に、setを使って2つのリストの共通部分を求める方法を紹介します。リストはそのままsetに格納できないため、一度タプルに変換する点に注意してください。以下の手順に従います。
- map関数を使って、各サブリストをタプルに変換する
- intersectionメソッドで2つの集合の共通部分(積集合)を求める
- 結果をリスト形式に戻す
- 結果を出力する
サンプルコード
# リストの初期化 list_1 = [[1, 2], [3, 4], [5, 6]] list_2 = [[3, 4]] # setで扱えるよう各サブリストをタプルに変換 tuple_1 = map(tuple, list_1) tuple_2 = map(tuple, list_2) # 共通部分(積集合)を求める result = list(map(list, set(tuple_1).intersection(tuple_2))) # 結果の出力 print(result)
こちらのコードも同様に、次の結果が出力されます。
実行結果
[[3, 4]]
それぞれの方法の使い分け
- リスト内包表記: コードが直感的で分かりやすい反面、要素数が多い場合は計算量がO(n×m)に増えるため、大規模データでは処理が遅くなる可能性があります。
- setを使う方法: 集合演算により高速に共通部分を求められます。大量のデータを扱う場合に有効ですが、リストからタプルへの変換処理が必要になります。
まとめ
この記事では、ネストされたリストから共通部分を抽出する2つの方法を紹介しました。データの規模や用途に応じて、シンプルなリスト内包表記か高速なset演算かを選択するとよいでしょう。記事の内容について質問がある場合は、コメント欄でお気軽にお尋ねください。
-
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のリスト(List)について学びます。リストの作成方法、要素へのアクセス、要素の追加・削除、リスト自体の削除など、基本的な操作を一つずつ丁寧に解説していきます。 Pythonでは、リストは角括弧 [] を使って構築し、各要素はカンマ , で区切って記述します。 Pythonのリストは、異なる型のオブジェクトを混在させて格納できるのが特徴です。すべて文字列である必要も、整数である必要もありません。例えば、以下のように複数の型が混ざったリストを作成できます。mixedTypesList = [a, True, 1, 1.0] リストの作成方法 リストは、角括弧