Python | データ構造:set

Python
スポンサーリンク

set の概要(重複なし・順序なし・高速な「集まり」)

set は「重複を許さない要素の集まり」を表すデータ構造です。要素の順序は保持されません(取り出す順番は不定)。同じ値を追加しても1つにまとまり、存在確認や集合演算が速く行えます。空の set は set() で作り、{} 単体は辞書になる点に注意してください。

empty = set()              # 空のセット
nums  = {1, 2, 3, 3}       # 重複は自動で消える → {1, 2, 3}
chars = set("banana")      # 文字の重複も消える → {'b','a','n'}
print(type(empty))         # <class 'set'>
Python

生成・追加・削除の基本操作(ここが重要)

作り方と重複除去の性質

リストや文字列から set(…) に変換すると、重複が一度に除去できます。順序が必要なら、変換後に sorted(…) で並べ直してリストへ戻します。

items = ["apple", "banana", "apple", "orange"]
uniq  = set(items)                 # {'apple','banana','orange'}
uniq_list = sorted(uniq)           # ['apple','banana','orange']
Python

要素の追加とまとめて追加

add は1要素、update は複数要素(反復可能)をまとめて追加します。

s = {"A"}
s.add("B")                 # 1件追加
s.update(["C", "D"])       # 複数をまとめて追加
print(s)                   # {'A','B','C','D'}
Python

削除の違い(remove と discard と pop)

  • remove(x): x がなければエラー(KeyError)
  • discard(x): x がなくてもエラーなし(静かに無視)
  • pop(): 任意の1要素を取り出して削除(どれが取れるかは不定)
s = {"apple", "banana"}
s.discard("orange")        # エラーなし
try:
    s.remove("orange")     # 存在しないと KeyError
except KeyError:
    pass

v = s.pop()                # どれか1つ取り出し削除
print(v, s)
Python

集合演算(和・積・差・対称差)と関係チェック(重要ポイントを深掘り)

代表的な演算

  • 和集合 | : 「どちらかにある」要素の集まり
  • 積集合 & : 「両方にある」共通要素
  • 差集合 – : 「片方にのみある」要素(左から右を引く)
  • 対称差 ^ : 「どちらか一方にのみある」要素
A = {1, 2, 3}
B = {3, 4}

print(A | B)  # {1, 2, 3, 4}
print(A & B)  # {3}
print(A - B)  # {1, 2}
print(A ^ B)  # {1, 2, 4}
Python

包含関係の判定

  • A <= B(または A.issubset(B)): A は B の部分集合
  • A >= B(または A.issuperset(B)): A は B を含む
  • A.isdisjoint(B): 共通要素がない
A = {1, 2}
B = {1, 2, 3}
print(A <= B, A.issubset(B))      # True True
print(B >= A, B.issuperset(A))    # True True
print(A.isdisjoint({3, 4}))       # True
Python

実務での使いどころ(重複除去・高速検索・差分管理)

重複除去と集計の前処理

データを集計する前に set で重複を取り除くと、以降の処理が簡潔になります。再度リストに戻して並べたい場合は sorted を使います。

emails = ["a@x", "b@x", "a@x", "c@x"]
unique = sorted(set(emails))
print(unique)  # ['a@x', 'b@x', 'c@x']
Python

高速な存在確認(メンバーシップテスト)

in 判定が高速です。ブラックリスト・既知 ID のチェックなどに向いています。

known_ids = set(range(100000))
print(12345 in known_ids)  # True(高速)
Python

差分や更新対象の抽出

「新着だけ」「削除されたもの」を簡潔に取り出せます。

before = {"A", "B", "C"}
after  = {"B", "C", "D"}

added   = after - before         # {'D'}
removed = before - after         # {'A'}
kept    = before & after         # {'B','C'}
Python

仕様と落とし穴(ハッシュ可能・順序なし・空集合の作り方)

要素は「ハッシュ可能」だけ

数値・文字列・タプルは OK。リストや辞書など可変(ミュータブル)なものは要素にできません。必要ならタプルへ変換します。

s = set()
s.add((1, 2))             # OK(タプル)
# s.add([1, 2])          # NG(TypeError)
Python

順序がないことを前提に

set は順序を持たないため、インデックスアクセスはできません。表示順が必要なら sorted(…) で並べてから使う設計にします。

s = {"banana", "apple", "orange"}
for x in sorted(s):
    print(x)              # 安定した並びで表示
Python

空集合は set()、{} は辞書

空の set を作るときは必ず set() を使います。{} は空の dict です。

empty_set = set()
empty_dict = {}
print(type(empty_set), type(empty_dict))
Python

応用:内包表記・frozenset(不変セット)・文字種解析

set 内包表記で宣言的に作る

squares = {n*n for n in range(6) if n % 2 == 0}
print(squares)  # {0, 4, 16, 36}
Python

frozenset は「変更不可の集合」

辞書キーにしたい、変更されたくない集合は frozenset を使います。

fs = frozenset({1, 2, 3})
d = {fs: "immutable-key"}
print(d[fs])  # immutable-key
Python

文字列の文字種を素早く抽出

text = "Coffee & Tea 123"
chars = set(text)
print(chars)  # 使用文字の種類セット
Python

例題で身につける(定番から一歩先まで)

例題1:重複メールの除去と並べ替え

emails = ["b@x", "a@x", "b@x", "c@x"]
print(sorted(set(emails)))  # ['a@x', 'b@x', 'c@x']
Python

例題2:権限の和・積・差

user = {"read", "write"}
role = {"read", "delete"}

print(user | role)  # 和: {'read','write','delete'}
print(user & role)  # 積: {'read'}
print(user - role)  # 差: {'write'}
Python

例題3:更新差分の抽出

old = {"A", "B", "C"}
new = {"B", "C", "D"}

print("追加:", new - old)
print("削除:", old - new)
print("共通:", old & new)
Python

例題4:安全な削除と例外回避

s = {"apple", "banana"}
s.discard("orange")     # エラーにならない
# s.remove("orange")    # KeyError になる可能性
Python

まとめ

set は「重複なし・順序なし」の集合で、重複除去・高速な存在確認・集合演算が得意です。add/update/remove/discard/pop を使い分け、演算子(| & – ^)と関係チェック(issubset/issuperset/isdisjoint)で差分や共通を簡潔に扱えます。要素はハッシュ可能に限られ、順序が必要なら sorted で並べる、空集合は set() を使うなどの基本を徹底しましょう。これを押さえれば、初心者でもデータクレンジングや権限管理、差分検出を短く正確に書けます。

タイトルとURLをコピーしました