概要(set の和集合は「重複を除いて全部まとめる」基本操作)
和集合(union)は、複数の集合の要素を重複なしでまとめた結果を返します。順序は保証されず、同じ値は1つに統合されます。Python では演算子「|」またはメソッド set.union(…) を使い、必要に応じて元集合を更新する「update(|=)」も選べます。
A = {"apple", "banana"}
B = {"banana", "orange"}
print(A | B) # {'apple', 'banana', 'orange'}
print(A.union(B)) # 同じ結果
Python基本の使い方(ここが重要)
演算子「|」でシンプルに二集合を結合する
「|」は最短で分かりやすい書き方です。二集合での統合に向き、読みやすさを優先したい場面で使います。
A = {1, 2, 3}
B = {3, 4}
print(A | B) # {1, 2, 3, 4}
Pythonunion の可変引数で「3つ以上」を一度にまとめる
複数集合の結合は union にまとめて渡すとすっきり書けます。可読性が上がり、途中変数も減らせます。
A = {1, 2}
B = {2, 3}
C = {3, 4}
print(A.union(B, C)) # {1, 2, 3, 4}
Python元集合を更新するなら update(演算子なら「|=」)
新しい集合を作るのではなく、既存の集合を直接「和集合の結果」に書き換えます。メモリを節約したいときや、状態を持つコードに適しています。
A = {"a", "b"}
A.update({"b", "c"}) # 破壊的更新
print(A) # {'a', 'b', 'c'}
B = {1}
B |= {1, 2}
print(B) # {1, 2}
Python重要ポイントの深掘り(型・性能・境界挙動)
リストやタプルは「set に変換」してから和集合を取る
集合演算は set 同士が基本です。元が配列なら set(…) に変換し、必要に応じて並べ替えや型へ戻しましょう。
tags1 = ["coffee", "tea", "tea"]
tags2 = ["tea", "milk", "coffee"]
merged = set(tags1) | set(tags2)
print(sorted(merged)) # ['coffee', 'milk', 'tea']
Python大量データでは「大きい集合を最後に」結合すると効率的
和集合は基本的に「片方へ他方を追加」する処理です。サイズの小さい集合から順に足していくと、途中の membership チェックが少なくなりがちで効率的です。
sets = [set(range(0, 100000, 7)), set(range(10)), set(range(0, 100000, 11))]
sets.sort(key=len)
res = sets[0].union(*sets[1:])
Python値はハッシュ可能(不変)である必要がある
set の要素はハッシュ可能でなければなりません。リストは不可、タプルや frozenset は可。和集合の軸にするキー型の選定を意識しましょう。
A = {("x", 1), ("y", 2)}
B = {("y", 2), ("z", 3)}
print(A | B) # {('x',1), ('y',2), ('z',3)}
Python実務での使いどころ(タグ統合・拡張子カタログ・検索の OR 条件)
タグやカテゴリの統合(重複排除しつつ全部まとめる)
複数ソースから得たタグを重複なくまとめ、表示やフィルタに使います。
post1 = {"coffee", "beans"}
post2 = {"coffee", "brew"}
all_tags = post1 | post2
Python拡張子や機能フラグのカタログ化(集合で一覧を維持)
各モジュールが扱う拡張子を統合し、対応一覧を作れます。重複を気にせず安全に結合できます。
images = {".png", ".jpg"}
docs = {".pdf", ".docx", ".jpg"}
supported = images | docs # {'.png', '.jpg', '.pdf', '.docx'}
Python検索の OR 条件を集合で表現(一致候補の広がり)
条件ごとの一致 ID を集合にして、OR 条件は和集合、AND 条件は積集合とすると読みやすくなります。
cond1 = {101, 102, 105}
cond2 = {102, 104}
result_or = cond1 | cond2 # {101, 102, 104, 105}
result_and = cond1 & cond2 # {102}
Pythonよくある落とし穴の回避(空集合の作り方・文字列の扱い・辞書ビュー)
空集合は set()。{} は空辞書なので注意
初期化で {} を使うと dict になります。集合の初期値は set() にしましょう。
empty = set()
Python文字列を set にすると「文字の集合」になる
単語の和集合を取りたいなら、split などでトークン化してから集合化します。
s1 = "coffee tea sugar"
s2 = "tea milk"
print(set(s1.split()) | set(s2.split())) # {'coffee','tea','sugar','milk'}
Python辞書のキー・値の和集合は「view」を使う
辞書同士で共通のキー集合や全キー集合を作る場合、.keys() / .values() を集合演算にかけます。
A = {"id":1, "name":"hanako"}
B = {"id":2, "city":"Tokyo"}
print(A.keys() | B.keys()) # {'id', 'name', 'city'}
Python例題で身につける(定番から一歩先まで)
例題1:CSV から「出現した全商品名」を重複なしで抽出
import csv
def all_items(path, cols):
with open(path, "r", encoding="utf-8", newline="") as f:
rows = list(csv.reader(f))
sets = [{r[c] for r in rows if len(r) > c} for c in cols]
sets.sort(key=len) # 小さい集合から結合すると効率的
return sets[0].union(*sets[1:])
# print(all_items("sales.csv", [0, 1]))
Python例題2:ディレクトリ群の「全拡張子」を統合
from pathlib import Path
def ext_set(root: str) -> set[str]:
return {p.suffix.lower() for p in Path(root).rglob("*") if p.is_file()}
all_exts = ext_set("dirA") | ext_set("dirB") | ext_set("dirC")
print(sorted(all_exts))
Python例題3:機能フラグのカタログを更新(破壊的 update)
features = {"export", "import"}
features.update({"analyze", "export"}) # 重複は統合される
print(features) # {'export','import','analyze'}
Python例題4:リスト入力から和集合を安全に作って出力整形
def union_lists(*lists):
sets = [set(lst) for lst in lists]
return sets[0].union(*sets[1:]) if sets else set()
print(sorted(union_lists([1,2,2], [2,3], [3,4])))
Pythonまとめ
set の和集合は「複数集合の要素を重複なくまとめる」ための最短手段です。二集合なら「|」、複数なら union を使い、元集合の更新は update(|=)で行う。配列データは set へ変換してから演算し、大量データは小さい集合から結合すると効率的。空集合は set()、文字列はトークン化、辞書は keys()/values() のビューで扱う。和集合を「OR 条件の基本」として習慣化すれば、タグ統合、拡張子カタログ、検索の広がりまで、短く正確で実務品質のコードが書けます。
