Pythonでセット同士の演算(和集合・差集合・積集合)を行う方法 初心者向け完全ガイド
生徒
「Pythonのセットって重複を消せるのは知ってるんですが、セット同士を組み合わせたり、共通部分だけを取り出す方法はありますか?」
先生
「はい、それがまさにセット演算です。和集合・差集合・積集合という操作を使えば、データを簡単に整理したり比較できます。」
生徒
「和集合とか積集合って数学で聞いたことがあるような…」
先生
「そうです。中学校や高校の数学で習った集合の概念が、そのままPythonでも使えます。では、具体的な使い方を見ていきましょう。」
1. Pythonのセット演算とは?集合(set)の基本とメリット
Python(パイソン)の「セット(set)」は、数学で学ぶ「集合」と同じ考え方でデータを扱う仕組みです。最大の特徴は、リスト(list)とは違い、「同じ値を重複して持てない」ことと「順番を保持しない」ことです。
このセット同士を組み合わせる「セット演算」をマスターすると、大量のデータの中から特定の条件に合うものだけを瞬時に取り出すことができるようになります。プログラミング未経験の方でも、まずは「グループ同士の比較」とイメージすればOKです。
例えば、ECサイトの「お気に入りリスト」を比較して、AさんとBさんの好みがどれくらい共通しているか(積集合)、あるいはAさんだけが気になっている商品はどれか(差集合)といった分析が、わずか1行のコードで実現できます。
まずは、セットがどのように重複を排除し、どのようなイメージで演算を行うのか、簡単な例で見てみましょう。
# 買い物リスト(重複あり)をセットに変換する例
fruits_list = ["りんご", "みかん", "りんご", "ぶどう"]
fruits_set = set(fruits_list)
# 自動で重複が消え、ユニークなデータだけが残ります
print(fruits_set)
このように、セットを使えば「データのダブり」を気にする必要がありません。この「きれいなデータの塊」同士を合体させたり、引き算したりするのが、これから解説する「和集合」「差集合」「積集合」といった便利な演算機能です。
2. 和集合(union)|2つのセットを統合する方法
和集合(union)とは、2つのセットに含まれるすべての要素を1つにまとめ、新しいセットを作る操作です。セットの最大の特徴である「重複を許さない」という性質により、両方のセットに共通して含まれている要素があっても、結果として出力されるのは1つだけになります。
Pythonで和集合を求めるには、記号の|(垂直棒:パイプライン)を使う方法と、union()メソッドを使う方法の2種類があります。どちらを使っても結果は同じですが、初心者の方は直感的に分かりやすい|から覚えるのがおすすめです。
和集合の具体的な使い方とサンプルコード
例えば、あなたが持っている果物のリストと、友達が持っている果物のリストを合体させて「全種類のメニュー」を作る場面をイメージしてみましょう。
# あなたが持っている果物
my_fruits = {"りんご", "みかん", "バナナ"}
# 友達が持っている果物(バナナが重複しています)
friend_fruits = {"バナナ", "もも", "パイナップル"}
# 方法1:記号「|」を使って和集合を作る
all_fruits_1 = my_fruits | friend_fruits
print(all_fruits_1)
# 方法2:union()メソッドを使って和集合を作る
all_fruits_2 = my_fruits.union(friend_fruits)
print(all_fruits_2)
実行結果は以下の通りです。両方に含まれていた「バナナ」が1つにまとめられ、すべての果物が揃った集合ができあがります。
{'パイナップル', 'もも', 'みかん', 'バナナ', 'りんご'}
{'パイナップル', 'もも', 'みかん', 'バナナ', 'りんご'}
※セットには「順序」がないため、実行するたびに表示される順番が変わることがありますが、中身のデータとしては正しく統合されているので安心してくださいね。
3. 差集合(difference)
差集合とは、片方のセットにあって、もう片方にはない要素を取り出す演算です。記号は-(マイナス)またはdifference()メソッドを使います。
a = {"りんご", "みかん", "バナナ"}
b = {"バナナ", "もも", "パイナップル"}
print(a - b)
print(b - a)
{'みかん', 'りんご'}
{'パイナップル', 'もも'}
4. 積集合(intersection)
積集合とは、両方のセットに共通して含まれる要素だけを取り出す演算です。記号は&(アンパサンド)またはintersection()メソッドを使います。
a = {"りんご", "みかん", "バナナ"}
b = {"バナナ", "もも", "パイナップル"}
print(a & b)
print(a.intersection(b))
{'バナナ'}
{'バナナ'}
5. 対称差集合(symmetric_difference)
対称差集合とは、どちらか片方にだけ含まれる要素を取り出す演算です。両方にある要素は除かれます。記号は^(キャレット)またはsymmetric_difference()を使います。
a = {"りんご", "みかん", "バナナ"}
b = {"バナナ", "もも", "パイナップル"}
print(a ^ b)
{'もも', 'りんご', 'パイナップル', 'みかん'}
6. 応用例:会員データの比較
例えば、オンラインサービスの会員データで「無料会員と有料会員の両方にいるユーザー」「無料会員だけのユーザー」「有料会員だけのユーザー」を調べる場合に集合演算が役立ちます。
free_users = {"佐藤", "鈴木", "高橋", "田中"}
paid_users = {"田中", "伊藤", "佐藤"}
# 共通ユーザー
print(free_users & paid_users)
# 無料会員だけ
print(free_users - paid_users)
# 有料会員だけ
print(paid_users - free_users)
{'佐藤', '田中'}
{'高橋', '鈴木'}
{'伊藤'}
7. 初心者が覚えるべきポイント
- 和集合:すべての要素をまとめる(
|またはunion()) - 差集合:片方だけにある要素を取り出す(
-またはdifference()) - 積集合:両方に共通する要素だけ(
&またはintersection()) - 対称差集合:どちらか一方だけにある要素(
^またはsymmetric_difference())
これらを使いこなすと、データの比較や整理が非常に簡単になります。特に大規模なデータ処理や検索機能の実装にも役立ちます。