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_permissions と admins_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 A が set B の部分集合であるか(Aの全要素がBに含まれているか)を判定します。
.issuperset() または >=
set A が set 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の判定
これらのメソッドや演算子を活用することで、複雑なデータの比較やフィルタリングを簡潔に記述できます。
