Pythonのセット(集合)操作を徹底解説!主要メソッドと演算子の使い方
数学における集合(セット)とは、互いに異なるオブジェクトの集まりであり、それ自体が一つのオブジェクトとして扱われるものです。たとえば、2、4、6という数値は個別に見ればそれぞれ独立したオブジェクトですが、ひとまとめに考えればサイズ3の一つの集合「{2, 4, 6}」を形成します。
Pythonのセットには次のような特徴があります。
- 重複した要素を持たない
- 順序が定義されていない(インデックスによるアクセス不可)
- ミュータブル(frozensetを除く)
集合に対する基本的な演算
| 演算 | 記法 | 意味 |
|---|---|---|
| 積集合(共通部分) | A ∩ B | AとBの両方に含まれるすべての要素 |
| 和集合 | A ∪ B | AまたはB(あるいは両方)に含まれるすべての要素 |
| 差集合 | A − B | Aには含まれるがBには含まれないすべての要素 |
| 補集合 | A′(または Aᶜ) | 全体集合Uのうち、Aに含まれないすべての要素 |
Pythonにおいて、リストと比較したセット使用の主なメリットは、特定の要素がセットのメンバーであるかどうかを高速に判定できる点です。これは内部でハッシュテーブルというデータ構造を採用しているためで、`in`演算子による存在チェックが平均的にO(1)の計算量で実行されます。
セットの主なメソッド
add(x) メソッド
まだ存在しない場合に限り、要素xをセットに追加します。
A = {"AA", "BB", "CC"}
A.add("VV")
このコードを実行すると、セットAに「VV」が追加されます。すでに存在する要素を追加してもエラーにはなりませんが、セットの内容は変化しません。
union(s) メソッド
2つのセットの和集合を返します。既存の2つのセットに対して演算子「|」を使うことは、`My_Set1.union(My_Set2)`と書くことと同じです。
A = {"AA", "BB", "CC"}
B = {"MM", "NN"}
Z = A.union(B)
# または
Z = A | B
結果のセットZには、AとBの両方の要素がすべて含まれます。
intersection(s) メソッド
与えられた2つのセットの積集合を返します。この操作では「&」演算子も利用できます。
S = A.intersection(B) # または S = A & B
セットSには、AとBに共通して含まれる要素のみが格納されます。
difference(s) メソッド
最初のセットには存在するが、2番目のセットには存在しないすべての要素を含む差集合を返します。「-」演算子でも同じ結果が得られます。
W = A.difference(B) # または W = A - B
セットWには、「Aには含まれるがBには含まれない」すべての要素が入ります。
clear() メソッド
セット内の全要素を削除し、空のセットにします。
B.clear()
このコードでセットBの中身が完全にクリアされます。
セットで使える演算子一覧
setおよびfrozensetは、以下の演算子をサポートしています。
key in s # keyがsに含まれるかどうかの判定 key not in s # keyがsに含まれないことの判定 s1 == s2 # s1とs2が等しいかどうか s1 != s2 # s1とs2が等しくないかどうか s1 <= s2 # s1がs2の部分集合であること s1 < s2 # s1がs2の真部分集合であること s1 >= s2 # s1がs2の上位集合(スーパーセット)であること s1 > s2 # s1がs2の真上位集合であること s1 | s2 # s1とs2の和集合 s1 & s2 # s1とs2の積集合 s1 - s2 # s1には含まれるがs2には含まれない要素の集合 s1 ^ s2 # s1またはs2のどちらか一方だけに含まれる要素の集合(対称差)
実践サンプルコード
ここまでの内容を実際のコードで確認してみましょう。
# Pythonにおけるセットの動作を実演するプログラム
# 2つのセットを作成
My_Set1 = set()
My_Set2 = set()
# My_Set1に要素を追加
for i in range(1, 6):
My_Set1.add(i)
# My_Set2に要素を追加
for i in range(3, 8):
My_Set2.add(i)
print("My_Set1 = ", My_Set1)
print("My_Set2 = ", My_Set2)
print("\n")
# My_Set1とMy_Set2の和集合
My_Set3 = My_Set1 | My_Set2 # My_Set1.union(My_Set2) と同等
print("Union of My_Set1&My_Set2: My_Set3 = ", My_Set3)
# My_Set1とMy_Set2の積集合
My_Set4 = My_Set1 & My_Set2 # My_Set1.intersection(My_Set2) と同等
print("Intersection of My_Set1&My_Set2: My_Set4 = ", My_Set4)
print("\n")
# My_Set3とMy_Set4の包含関係を確認
if My_Set3 > My_Set4: # My_Set3.issuperset(My_Set4) と同等
print("My_Set3 is superset of My_Set4")
elif My_Set3 < My_Set4: # My_Set3.issubset(My_Set4) と同等
print("My_Set3 is subset of My_Set4")
else: # My_Set3 == My_Set4 の場合
print("My_Set3 is same as My_Set4")
# My_Set4とMy_Set3の関係を表示
if My_Set4 < My_Set3: # My_Set4.issubset(My_Set3) と同等
print("My_Set4 is subset of My_Set3")
print("\n")
# My_Set3とMy_Set4の差集合
My_Set5 = My_Set3 - My_Set4
print("Elements in My_Set3 and not in My_Set4: My_Set5 = ", My_Set5)
print("\n")
# My_Set4とMy_Set5が互いに素(共通要素なし)かどうかを確認
if My_Set4.isdisjoint(My_Set5):
print("My_Set4 and My_Set5 have nothing in common\n")
# My_Set5の全要素を削除
My_Set5.clear()
print("After applying clear on sets My_Set5: ")
print("My_Set5 = ", My_Set5)
実行結果
My_Set1 = {1, 2, 3, 4, 5}
My_Set2 = {3, 4, 5, 6, 7}
Union of My_Set1&My_Set2: My_Set3 = {1, 2, 3, 4, 5, 6, 7}
Intersection of My_Set1&My_Set2: My_Set4 = {3, 4, 5}
My_Set3 is superset of My_Set4
My_Set4 is subset of My_Set3
Elements in My_Set3 and not in My_Set4: My_Set5 = {1, 2, 6, 7}
My_Set4 and My_Set5 have nothing in common
After applying clear on sets My_Set5:
My_Set5 = set()
まとめ
Pythonのセットは、重複のないデータ管理や高速な存在判定が必要な場面で非常に強力なデータ型です。特に以下のようなケースで活躍します。
- リストから重複要素を除去したいとき
- 大量のデータに対して要素の存在チェックを繰り返し行いたいとき
- 2つのグループの共通項や差分を求めたいとき
`union()`・`intersection()`・`difference()`といったメソッドと、`|`・`&`・`-`などの演算子の両方を使いこなせるようになると、より読みやすく効率的なコードが書けるようになります。ぜひ実際に手を動かして試してみてください。
-
Pythonの「<>」演算子とは?Python 2とPython 3での違いを解説
Pythonには、2つの値が「等しくない」ことを判定するための比較演算子として、かつて「<>」という記法が存在していました。これは数式における「≠」に相当する演算子で、Python 2.x系で利用できました。同じ動作をする「!=」演算子もありますが、Python 3.xでは「<>」演算子は廃止され、使用するとエラーになる点に注意が必要です。 Python 2.7での使用例 Python 2.7では、「<>」と「!=」のどちらも「等しくない」判定として同じ結果を返します。 >>> a=5 >>> b=7 >>&g
-
Pythonのセット(set)とは?作成・操作・結合の基本を徹底解説
Pythonのセット(set)は、順序を持たない(unordered)コレクション型で、重複のない一意な(unique)かつ変更不可能な(immutable)オブジェクトを格納します。つまり、セットに同じ要素を複数入れることはできず、一度作成した要素そのものを書き換えることもできません。 ポイント: セットの「要素」はイミュータブル(変更不可)ですが、セット自体はミュータブル(変更可能)です。そのため、後から要素の追加や削除を行うことは可能です。 セットは順序を保持しません。同じセットを何度 print しても、表示される要素の並び順が変わることがあります。 Pythonでは、セットを波括弧