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}
Pythonfrozenset は「変更不可の集合」
辞書キーにしたい、変更されたくない集合は 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() を使うなどの基本を徹底しましょう。これを押さえれば、初心者でもデータクレンジングや権限管理、差分検出を短く正確に書けます。
