Pythonのset(集合)演算:union, intersection, difference の使い方

Pythonのset(集合型)は、単に重複しない要素を格納するだけでなく、数学の「集合」と同じように、**論理演算(集合演算)**を行うための強力なメソッドを備えています。

  • 和集合: 2つのsetのすべての要素(重複なし)
  • 積集合: 2つのsetに共通する要素
  • 差集合: 片方のsetにのみ存在する要素

これらの演算は、データ分析、権限管理、重複の処理など、多くの場面で役立ちます。この記事では、set の主要な論理演算メソッドについて解説します。

目次

準備:サンプルとなるset

例として、2つの異なるユーザーグループが持つ権限(permission)をsetで定義します。

# 編集者グループの権限
editors_permissions = {"read", "write", "comment"}

# 管理者グループの権限
admins_permissions = {"comment", "delete", "admin_access", "write"}

print(f"編集者: {editors_permissions}")
print(f"管理者: {admins_permissions}")

実行結果:

編集者: {'comment', 'read', 'write'}
管理者: {'write', 'delete', 'comment', 'admin_access'}

set は順序を持たないため、表示順序は異なる場合があります)

1. 和集合(Union): .union() または |

和集合は、両方のsetに含まれる全てのユニークな要素からなる新しいsetを作成します。

editors_permissionsadmins_permissions のどちらか一方にでも含まれる権限の全種類を取得するのに使えます。

# .union() メソッドを使用
all_permissions = editors_permissions.union(admins_permissions)
print(f"すべての権限 (union): {all_permissions}")

# | (パイプ) 演算子も同じ結果になります
all_permissions_op = editors_permissions | admins_permissions
print(f"すべての権限 (|): {all_permissions_op}")

実行結果:

すべての権限 (union): {'comment', 'admin_access', 'read', 'delete', 'write'}
すべての権限 (|): {'comment', 'admin_access', 'read', 'delete', 'write'}

2. 積集合(Intersection): .intersection() または &

積集合は、両方のset共通して存在する要素のみからなる新しいsetを作成します。

編集者と管理者の両方が共通して持つ権限を取得するのに使えます。

# .intersection() メソッドを使用
common_permissions = editors_permissions.intersection(admins_permissions)
print(f"共通の権限 (intersection): {common_permissions}")

# & (アンパサンド) 演算子も同じ結果になります
common_permissions_op = editors_permissions & admins_permissions
print(f"共通の権限 (&): {common_permissions_op}")

実行結果:

共通の権限 (intersection): {'comment', 'write'}
共通の権限 (&): {'comment', 'write'}

3. 差集合(Difference): .difference() または -

差集合は、最初のsetには存在するが、2番目のsetには存在しない要素からなる新しいsetを作成します。

「編集者 だけが 持つ権限」(管理者にはない権限)を取得するのに使えます。

# .difference() メソッドを使用
editor_only_permissions = editors_permissions.difference(admins_permissions)
print(f"編集者のみの権限 (difference): {editor_only_permissions}")

# - (ハイフン) 演算子も同じ結果になります
editor_only_permissions_op = editors_permissions - admins_permissions
print(f"編集者のみの権限 (-): {editor_only_permissions_op}")

# 順序を逆にすると、管理者だけが持つ権限が取得できる
admin_only_permissions = admins_permissions.difference(editors_permissions)
print(f"管理者のみの権限: {admin_only_permissions}")

実行結果:

編集者のみの権限 (difference): {'read'}
編集者のみの権限 (-): {'read'}
管理者のみの権限: {'delete', 'admin_access'}

4. 部分集合(Subset)と上位集合(Superset)

2つのsetが包含関係にあるかどうかを判定するメソッドもあります。これらはブール値(True / False)を返します。

.issubset() または <=

set Aset B部分集合であるか(Aの全要素がBに含まれているか)を判定します。

.issuperset() または >=

set Aset B上位集合であるか(AがBの全要素を含んでいるか)を判定します。

# 別のサンプルセット
basic_access = {"read"}
full_access = {"read", "write", "delete"}

# --- 部分集合 (Subset) ---
# "basic_access" は "full_access" の部分集合か?
is_subset = basic_access.issubset(full_access)
print(f"is_subset: {is_subset}")

# 演算子
print(f"<=: {basic_access <= full_access}")

# --- 上位集合 (Superset) ---
# "full_access" は "basic_access" の上位集合か?
is_superset = full_access.issuperset(basic_access)
print(f"is_superset: {is_superset}")

# 演算子
print(f">=: {full_access >= basic_access}")

実行結果:

is_subset: True
<=: True
is_superset: True
>=: True

まとめ

set の集合演算は、2つのグループの共通点や差異を抽出する際に非常に強力です。

  • 和集合 (.union() or |): 全ての要素
  • 積集合 (.intersection() or &): 共通する要素
  • 差集合 (.difference() or -): 片方にしかない要素
  • 包含関係 (.issubset(), .issuperset()): True/False の判定

これらのメソッドや演算子を活用することで、複雑なデータの比較やフィルタリングを簡潔に記述できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次