HOWTO · Python

Python で 2つのセットを結合する方法

このチュートリアル記事では、Python で 2つのセットを結合する方法を紹介します。

このページの内容

Python のセットは一意な要素だけを格納するため、2つのセットを結合するとは和集合を求めることです。つまり、どちらかのセットに含まれるすべての要素を集め、重複を1つにまとめたコレクションを作ります。新しいセットが必要か、既存のセットを変更したいかに応じて、| 演算子、union() メソッド、またはインプレース形式の update() と |= を使い分けられます。

和集合演算子 | でセットを結合する

和集合演算子 | は2つのセットを取り、どちらか一方に含まれるすべての要素を持つ新しいセットを返します。元のセットは変更されません。

このセクションのコードと表示されるラベルや出力は英語のままです。

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

result_set = set1 | set2
print(result_set)
print(set1)
print(set2)

出力:

{1, 2, 3, 4, 5, 6}
{1, 2, 3, 4}
{3, 4, 5, 6}

共通する値 3 と 4 は result_set に一度だけ現れ、set1 と set2 は元の要素をそのまま保持します。| の両方のオペランドはセット型(set または frozenset)でなければなりません。セットとリストを | で結合すると TypeError になるため、先に set() でリストを変換してください。

update() または |= で要素をその場で追加する

新しいセットを作るのではなく、既存のセットに別のコレクションの要素を取り込みたい場合は、update() メソッドまたは |= による拡張代入を使います。どちらも新しいセットを返すのではなく、左辺のセットを変更します。

両者は受け付ける対象が異なります。update() はセット、リスト、タプル、文字列など任意のイテラブルを受け取りますが、|= は | と同じ制約に従い、右オペランドがセット型であることを要求します。

このセクションのコードと表示されるラベルや出力は英語のままです。

numbers = {1, 2, 3}

numbers.update([3, 4, 5])
print(numbers)

numbers |= {6, 7}
print(numbers)

出力:

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5, 6, 7}

update() 呼び出しはリストの新しい値を直接 numbers に追加し、続く |= は2番目のセットを同じオブジェクトに統合します。そのセットへの他のすべての参照からも変更が見えるため、これらの形式は変更を意図する場合にだけ使ってください。

union() で複数のセットやイテラブルを結合する

union() メソッドは | に対応するメソッド版です。新しいセットを返して入力をそのままに保つ点は同じですが、演算子とは異なり任意の数の引数を受け取り、各引数にはセットだけでなく任意のイテラブルを渡せます。

このセクションのコードと表示されるラベルや出力は英語のままです。

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

result_set = set1.union(set2, {7, 8}, [9, 10])
print(result_set)
print(set1)

出力:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 4}

この例では、union() が1回の呼び出しでセット、セットリテラル、リストを統合しており、set1 自体は元の要素を保持したままです。すべてのオペランドがすでにセットである場合、a.union(b) は a | b と同じ結果を生成します。

新しいセットが必要かどうかに合わせて操作を選ぶ

得たい結果に応じて形式を選びます:

  • 新しいセットが必要で元のセットを保持したい場合: 両方のオペランドがセットなら | を、オペランドがリストなどのイテラブルの場合や3つ以上のコレクションを結合する場合は union() を使います。
  • 既存のセットを変更したい場合: 任意のイテラブルには update() を、セットのオペランドには |= を使います。
  • 既存のコードを読んでいる場合: セットに対して a.union(b) と a | b は同じ意味で、a.update(b) と a |= b はそれぞれのインプレース版です。

ほとんどのコードでは、result = set1 | set2 が2つのセットを結合する直接的な答えです。オペランドがセットでない可能性がある場合は union() を、インプレースでの変更が目的の場合にのみ update() や |= を選んでください。