Python | データ構造強化:set の和集合

Python Python
スポンサーリンク
  1. 概要(set の和集合は「重複を除いて全部まとめる」基本操作)
  2. 基本の使い方(ここが重要)
    1. 演算子「|」でシンプルに二集合を結合する
    2. union の可変引数で「3つ以上」を一度にまとめる
    3. 元集合を更新するなら update(演算子なら「|=」)
  3. 重要ポイントの深掘り(型・性能・境界挙動)
    1. リストやタプルは「set に変換」してから和集合を取る
    2. 大量データでは「大きい集合を最後に」結合すると効率的
    3. 値はハッシュ可能(不変)である必要がある
  4. 実務での使いどころ(タグ統合・拡張子カタログ・検索の OR 条件)
    1. タグやカテゴリの統合(重複排除しつつ全部まとめる)
    2. 拡張子や機能フラグのカタログ化(集合で一覧を維持)
    3. 検索の OR 条件を集合で表現(一致候補の広がり)
  5. よくある落とし穴の回避(空集合の作り方・文字列の扱い・辞書ビュー)
    1. 空集合は set()。{} は空辞書なので注意
    2. 文字列を set にすると「文字の集合」になる
    3. 辞書のキー・値の和集合は「view」を使う
  6. 例題で身につける(定番から一歩先まで)
    1. 例題1:CSV から「出現した全商品名」を重複なしで抽出
    2. 例題2:ディレクトリ群の「全拡張子」を統合
    3. 例題3:機能フラグのカタログを更新(破壊的 update)
    4. 例題4:リスト入力から和集合を安全に作って出力整形
  7. まとめ

概要(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}
Python

union の可変引数で「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 条件の基本」として習慣化すれば、タグ統合、拡張子カタログ、検索の広がりまで、短く正確で実務品質のコードが書けます。

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