概要(セット内包表記は「重複なしの集合」を一行で作る)
セット内包表記は、for と if を“内側”に書いて、重複を自動的に排除する集合(set)を一行で作る記法です。基本は「{式 for 変数 in イテラブル}」。必要なら最後に「if 条件」を付けて、要素を選びながら作れます。リスト内包表記との違いは、結果が順序を持たず重複が取り除かれる点です。
# 基本形:{式 for 変数 in イテラブル}
squares = {x**2 for x in range(6)}
# {0, 1, 4, 9, 16, 25}
Python基本構文と考え方(ここが重要)
式・反復(for)・選別(if)
「どの値をどう変換して集合に入れるか」を見たままに書けます。式が“変換”、for が“反復”、if が“選別”の役割です。if は“末尾”に置いて、条件を満たす要素だけ集合へ入れます。
# 偶数だけ2倍して集合に
evens_twice = {x * 2 for x in range(10) if x % 2 == 0}
# {0, 4, 8, 12, 16}
Python重複は自動で排除される(ユニーク化)
set は同じ値が複数あっても一つにまとまります。データのユニーク化・正規化に向いています。
names = ["tea", "Tea", "coffee", "tea"]
unique = {s.lower() for s in names}
# {'tea', 'coffee'}
Python順序は保証されない(表示の並びに期待しない)
セットは“順序なし”が原則です。並びが必要なら list や sorted に変換して扱います。
nums = {x**2 for x in range(6)}
print(sorted(nums)) # [0, 1, 4, 9, 16, 25]
Pythonよく使うパターン(ユニーク化・文字列処理・辞書との併用)
リストから重複を削除してユニーク化
「一意な値の一覧」が欲しいときの定番です。
data = ["A", "B", "A", "C", "B"]
unique = {x for x in data}
# {'A', 'B', 'C'}
Python文字列の前処理+非空だけ抽出して集合化
トリムや大小変換を行い、空は除外してユニークな集合を作ります。
rows = [" apple ", " ", "banana", "Apple", ""]
clean = {s.strip().lower() for s in rows if s.strip()}
# {'apple', 'banana'}
Python辞書の値からユニーク集合を作る
辞書の values を加工し、重複なし集合にします。
users = {"u1": "Tokyo", "u2": "Osaka", "u3": "Tokyo"}
cities = {city for city in users.values()}
# {'Tokyo', 'Osaka'}
Python文字列から“使われている文字種”を抽出
テキストの中に含まれるユニークな文字を一発で取り出せます。
text = "Coffee Latte"
chars = {c.lower() for c in text if c.isalpha()}
# {'c', 'o', 'f', 'e', 'l', 'a', 't'}
Python重要ポイントの深掘り(ハッシュ可能・可読性・性能)
要素は“ハッシュ可能”である必要がある
set の要素は不変でハッシュ可能な型(数値、文字列、タプルなど)に限られます。リストや辞書は入れられません。複合データは“タプル化”して格納します。
points = {(x, y) for x in range(2) for y in range(2)}
# {(0, 0), (0, 1), (1, 0), (1, 1)}
Python条件や式が複雑なら“通常の for”へ戻す判断
内包表記は“変換+1条件”程度が読みやすい上限。分岐が増える、長くなる場合は関数化・通常の for/if に切り替えて可読性を保ちます。
計算量とメモリの目安
要素数に比例して O(n)。重複排除のハッシュ計算が行われますが、Python の set は高速です。巨大データでは必要に応じて、途中で集計・出力してメモリ使用を抑えます。
実践例で身につける(定番から一歩先まで)
例題1:偶数の二乗をユニークに収集
nums = [0, 1, 2, 2, 3, 4]
evens_sq = {n**2 for n in nums if n % 2 == 0}
print(evens_sq) # {0, 4, 16}
Python例題2:メールドメインのユニーク集合
users = ["taro@example.com", "hanako@test.jp", "jiro@example.com", ""]
domains = {u.split("@")[1] for u in users if "@" in u}
print(domains) # {'example.com', 'test.jp'}
Python例題3:タグの正規化(小文字・重複除去・空除外)
tags = ["Python", "python", " AI", "", "AI "]
norm = {t.strip().lower() for t in tags if t.strip()}
print(norm) # {'python', 'ai'}
Python例題4:辞書の配列からユニーク商品名
rows = [
{"name": "coffee", "price": 350},
{"name": "tea", "price": 280},
{"name": "coffee", "price": 360},
]
unique_names = {r["name"] for r in rows}
print(unique_names) # {'coffee', 'tea'}
Pythonまとめ
セット内包表記は「反復・選別・変換」を一行に凝縮し、重複を自動排除する集合を素早く作れる記法です。ハッシュ可能な要素だけが入れられる、順序は保証されない、複雑さが増したら通常の for に戻す——この要点を押さえれば、ユニーク化・前処理+抽出・辞書の値から集合化・文字集合の抽出など、初心者でも実務的なデータ整形を短く安全に書けます。
