Pythonのintersection_update()メソッドでn個の配列から共通要素を抽出する方法
はじめに
この記事では、Pythonの intersection_update() メソッドを使って、n個の配列(リスト)に共通する要素を見つける方法について解説します。
ここで扱う問題は、「複数のリストを含む配列が与えられたとき、すべてのリストに共通する要素をどのように求めるか」というものです。
intersection_update()とは?
intersection_update() はPythonのセット(set)型が持つメソッドの一つで、元のセット自身を「積集合」の結果で書き換えます。複数のセットやイテラブルに共通して存在する要素だけを残せるのが特徴で、新しいオブジェクトを作らずに元の変数を直接更新できるため、ループ処理と組み合わせると非常に便利です。
アルゴリズム
- 配列内の最初のリストで、結果を格納するセット
resを初期化します。 - リストを含む配列を先頭から順に反復処理します。
intersection_update()メソッドを適用して共通要素のみを残し、resを随時更新します。- 最終的な結果をリストとして返し、print文で出力します。
実装例
def commonEle(arr):
# res を最初のリストのセットで初期化
res = set(arr[0])
# ループのたびに、共通要素だけで res が更新されていく
for curr in arr[1:]: # スライスで2番目以降のリストを取得
res.intersection_update(curr)
return list(res)
# ドライバーコード
if __name__ == "__main__":
nest_list = [['t','u','o','r','i','a','l'],
['p','o','i','n','t'],
['t','u','o','r','i','a','l'],
['p','y','t','h','o','n']]
out = commonEle(nest_list)
if len(out) > 0:
print(out)
else:
print('No Common Elements')出力
['o', 't']
コードのポイント
- まず
set(arr[0])で最初のリストをセット化し、これを比較の起点とします。 arr[1:]のスライスにより、2番目以降のリストだけをループ対象にしています。intersection_update(curr)を呼び出すたびに、resは「現在の共通要素 ∩ 次のリスト」となり、共通部分が段階的に絞り込まれていきます。- 4つのリスト
['t','u','o','r','i','a','l']、['p','o','i','n','t']、['t','u','o','r','i','a','l']、['p','y','t','h','o','n']すべてに含まれる文字は'o'と't'のみのため、出力は['o', 't']となります。 - 共通要素がひとつも存在しない場合は空のリストが返るため、その判定も行っています。
なお、セットは順序を保証しないため、出力される要素の並び順は環境によって異なる場合があります。順序が必要な場合は sorted(res) を使うとよいでしょう。
まとめ
この記事では、Pythonの intersection_update() メソッドを活用して、n個の配列から共通要素を効率よく抽出する方法と、その具体的な実装について学びました。セット操作を組み合わせることで、ネストされたリストの共通部分を簡潔なコードで求められるため、データの重複チェックやフィルタリングなど、さまざまな場面で応用できます。
-
SeleniumとPythonで要素とテキストを取得する方法
Selenium WebDriverを使えば、Webページ上の要素とそのテキストを簡単に取得できます。手順としては、まずid、クラス名、CSSセレクターなどのロケーターを使って対象の要素を特定し、次にtextプロパティを使って要素内のテキストを取得します。基本構文s = driver.find_element_by_css_selector(h4).textここでdriverはWebDriverオブジェクトです。find_element_by_css_selectorメソッドは、CSSセレクターをロケーターとして要素を特定するために使用され、引数にロケーター値(この場合はh4)を渡します。最後
-
Pythonで二分木の最小共通祖先(LCA)を求めるアルゴリズムと実装例
はじめに二分木と2つの数値 a、b が与えられたとき、a と b を子孫として持つ最も深いノード(最小共通祖先:LCA)の値を求める問題を考えてみましょう。ここで重要なポイントは、「あるノードはそれ自身の子孫にもなり得る」という点です。つまり、片方のノードがもう片方の祖先である場合、そのノード自体が答えになります。例以下のような二分木を考えます。このとき、a = 6、b = 2 とすると、出力は 4 になります。値4のノードが、6と2の両方を子孫として持つ最も深いノードだからです。解法のアプローチこの問題は再帰を使って効率的に解くことができます。手順は以下の通りです。solve() メソッドを