このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

【Python入門】集合に特有な演算

集合に特有な演算

 Python の「集合(set)」型は、要素の重複を許さない・順序を持たないといった特徴があります。さらに、集合ならではの演算(和集合や積集合など)を使うと、複数の集合から新しい集合を作ったり、集合同士を組み合わせて便利に扱うことができます。ここでは、集合に特有な演算について概要を学び、具体的なコード例とともに解説していきます。

プログラムのダウンロード

 「ダウンロード」から、JupyterLab で実行できるサンプルプログラムがダウンロードできます。ファイルは、ESET Endpoint Securityでウイルスチェックをしておりますが、ダウンロードとプログラムの実行は自己責任でお願いいたします。


1.集合に特有の演算とは

 集合同士を組み合わせたり、ある集合から別の集合の要素を取り除いたりするために、Python では以下のような演算子が用意されています。

1.1. 主な演算子の一覧

使い方結果
集合A | 集合B集合A または 集合B に含まれる要素をすべて集めた集合(和集合
集合A & 集合B集合A かつ 集合B の両方に共通して含まれる要素の集合(積集合
集合A - 集合B集合A から 集合B に含まれる要素を取り除いた集合(差集合
集合A ^ 集合B集合A または 集合B の片方だけに含まれる要素の集合(対称差

1.2. 累算代入文を使った演算

 上記の演算と対応する「累算代入文」も存在します。結果として新しい集合を作るのではなく、「集合A」を直接変更したい場合に便利です。

使い方結果
集合A |= 集合B集合B の要素を 追加(= A = A ∪ B)
集合A &= 集合B集合B に含まれる要素 だけ を残し、それ以外を削除(= A = A ∩ B)
集合A -= 集合B集合B に含まれる要素を 削除(= A = A - B)
集合A ^= 集合B集合B の要素を 追加 し、両者に共通する要素を 削除(= A = A ⊕ B)

2.実際に使ってみる

 ここでは、例として二つの果物リストをもとにした集合を扱い、上記の演算を試してみます。要素が重複しない「集合」の特性を活かしながら、和集合や積集合などを一度に確認できます。

2.1. サンプルコード

# 1) 集合の作成
fruits1 = {"apple", "banana", "cherry", "mango"}
fruits2 = {"apple", "banana", "grape", "orange"}

# 2) ふたつの集合を表示
print("fruits1:", fruits1)
print("fruits2:", fruits2)

# 3) 和集合(union)
union_set = fruits1 | fruits2
print("和集合 (fruits1 | fruits2):", union_set)

# 4) 積集合(intersection)
intersection_set = fruits1 & fruits2
print("積集合 (fruits1 & fruits2):", intersection_set)

# 5) 差集合(difference)
diff_set_1 = fruits1 - fruits2
diff_set_2 = fruits2 - fruits1
print("差集合 (fruits1 - fruits2):", diff_set_1)
print("差集合 (fruits2 - fruits1):", diff_set_2)

# 6) 対称差(symmetric difference)
sym_diff_set = fruits1 ^ fruits2
print("対称差 (fruits1 ^ fruits2):", sym_diff_set)

実行結果

fruits1: {'banana', 'mango', 'cherry', 'apple'}
fruits2: {'banana', 'orange', 'apple', 'grape'}
和集合 (fruits1 | fruits2): {'cherry', 'orange', 'apple', 'banana', 'mango', 'grape'}
積集合 (fruits1 & fruits2): {'banana', 'apple'}
差集合 (fruits1 - fruits2): {'cherry', 'mango'}
差集合 (fruits2 - fruits1): {'orange', 'grape'}
対称差 (fruits1 ^ fruits2): {'cherry', 'orange', 'mango', 'grape'}

コード解説

  1. 集合の作成
    fruits1fruits2 はそれぞれ異なる果物名を格納した集合です。重複している要素("apple", "banana")もありますが、それが演算時の結果にどう影響するかがポイントです。
  2. ふたつの集合を表示
    print("fruits1:", fruits1) のように、まずは作成した集合を出力して確認します。集合は順序を持たないため、実行結果の表示順は固定されません。
  3. 和集合(union)
    fruits1 | fruits2 は「fruits1 あるいは fruits2 のいずれかに含まれる要素」をすべて集めた集合を返します。
    ・重複要素("apple" や "banana")は 1 つとして扱われます。
  4. 積集合(intersection)
    fruits1 & fruits2 は「両方の集合に共通して含まれる要素」だけを集めた集合を返します。
    ・今回の例だと、"apple""banana" が両方の集合に含まれているので、それらだけが残ります。
  5. 差集合(difference)
    fruits1 - fruits2 は「fruits1 に含まれる要素から、fruits2 に含まれる要素を取り除いた集合」です。
    fruits2 - fruits1 は逆に、「fruits2 に含まれる要素から fruits1 に含まれる要素を取り除いた集合」を返します。
    ・このように、引き算をする向きによって残る要素が変わるので、両方確認してみると便利です。
  6. 対称差(symmetric difference)
    fruits1 ^ fruits2 は「fruits1 または fruits2 の片方にのみ含まれる要素」を集めた集合です。両方の集合に共通するものは取り除かれる点が特徴です。

まとめ

 集合には、要素を重複させない・順序を持たないといった特性だけでなく、「和集合」や「積集合」などの演算が用意されています。これにより、複数の集合から新しい集合を簡単に生成したり、一方の集合からもう片方の集合の要素を除去したりできます。

 さらに、累算代入文(|=, &=, -= など)を使うと、一度に集合を更新できるので、コードの可読性と効率を高めるのに役立ちます。

 これらの機能を組み合わせると、重複チェックやリスト同士の比較などを効率的に実装できるようになるため、Python でのデータ処理やアルゴリズムの実装において非常に便利です。