言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Python辞典

  1. トップページ
  2. Python辞典
  3. セット.union() / セット.intersection() / セット.difference()

セット.union() / セット.intersection() / セット.difference()

対応: Python 2(2000)

セットの集合演算(和集合・積集合・差集合・対称差集合)を行うメソッドと演算子です。数学の集合論と同じ操作をPythonで簡潔に記述できます。

構文

# 和集合(どちらかに含まれる要素)
セット1.union(セット2)
セット1 | セット2

# 積集合(両方に含まれる要素)
セット1.intersection(セット2)
セット1 & セット2

# 差集合(セット1にあってセット2にない要素)
セット1.difference(セット2)
セット1 - セット2

# 対称差集合(どちらか一方にだけ含まれる要素)
セット1.symmetric_difference(セット2)
セット1 ^ セット2

メソッド・演算子一覧

メソッド / 演算子概要
セット1.union(セット2) / |セット1とセット2の和集合(どちらかに含まれる全要素)を新しいセットとして返します。
セット1.intersection(セット2) / &セット1とセット2の積集合(両方に含まれる要素)を新しいセットとして返します。
セット1.difference(セット2) / -セット1からセット2の要素を除いた差集合を新しいセットとして返します。
セット1.symmetric_difference(セット2) / ^どちらか一方にだけ含まれる対称差集合を新しいセットとして返します。
セット1.intersection_update(セット2) / &=セット1をセット2との積集合でインプレース更新します。
セット1.difference_update(セット2) / -=セット1からセット2の要素をインプレースで削除します。

サンプルコード

set_operations_basic.py
# 2つのセットを用意する
python_users = {'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー'}
java_users   = {'草薙京', 'テリー・ボガード', 'ゲーニッツ', '八神庵'}

# 和集合:どちらかの言語を使うユーザー
print(python_users | java_users)

# 積集合:両方の言語を使うユーザー
print(python_users & java_users)

# 差集合:Pythonだけ使うユーザー
print(python_users - java_users)

# 対称差集合:どちらか一方だけのユーザー
print(python_users ^ java_users)
python3 set_operations_basic.py
{'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー', 'ゲーニッツ'}
{'草薙京', 'テリー・ボガード', '八神庵'}
{'ブルー・マリー'}
{'ブルー・マリー', 'ゲーニッツ'}
set_operations_methods.py
# メソッドでも同じ操作ができる
kof_fighters = {'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー'}
kof_bosses   = {'ゲーニッツ', '八神庵', '草薙京', 'クリザリッド'}

union_set = kof_fighters.union(kof_bosses)
inter_set = kof_fighters.intersection(kof_bosses)
diff_set  = kof_fighters.difference(kof_bosses)

print(union_set)
print(inter_set)
print(diff_set)

# インプレース演算でセット自体を更新する
kof_fighters &= kof_bosses
print(kof_fighters)
python3 set_operations_methods.py
{'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー', 'ゲーニッツ', 'クリザリッド'}
{'八神庵', '草薙京'}
{'テリー・ボガード', 'ブルー・マリー'}
{'八神庵', '草薙京'}
set_operations_multi.py
# 複数のセットに対して一括で演算できる
kof_fighters  = {'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー'}
kof_bosses    = {'ゲーニッツ', '八神庵', '草薙京', 'クリザリッド'}
shared_chars  = {'八神庵', '草薙京', 'ギース・ハワード'}

# 3つのセットすべてに含まれる文字(積集合)
print(kof_fighters & kof_bosses & shared_chars)

# 3つのセットのいずれかに含まれる文字(和集合)
print(kof_fighters | kof_bosses | shared_chars)
python3 set_operations_multi.py
{'八神庵', '草薙京'}
{'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー', 'ゲーニッツ', 'クリザリッド', 'ギース・ハワード'}

よくあるミス

よくあるミス1: 演算子を使う場合は両辺がセットでなければならない

演算子(|, &, -, ^)でセット演算をするとき、両辺がセット型でなければ TypeError が発生します。リストやタプルを直接渡したい場合はメソッドを使うか、先にセットに変換します。

mistake1_ng.py
python_users = {'八神庵', '草薙京', 'テリー・ボガード'}
java_users_list = ['草薙京', 'テリー・ボガード', 'ゲーニッツ']

print(python_users | java_users_list)
python3 mistake1_ng.py
TypeError: unsupported operand type(s) for |: 'set' and 'list'
mistake1_ok.py
python_users = {'八神庵', '草薙京', 'テリー・ボガード'}
java_users_list = ['草薙京', 'テリー・ボガード', 'ゲーニッツ']

# メソッドはイテラブルを直接受け取れる
print(python_users.union(java_users_list))

# あるいはリストをセットに変換してから演算する
print(python_users | set(java_users_list))
python3 mistake1_ok.py
{'八神庵', '草薙京', 'テリー・ボガード', 'ゲーニッツ'}
{'八神庵', '草薙京', 'テリー・ボガード', 'ゲーニッツ'}

よくあるミス2: 差集合の順序を間違える

差集合は順序に依存します。A - B は「Aにあって Bにない要素」、B - A は「Bにあって Aにない要素」で結果が異なります。どちらにも含まれない要素を取得したい場合は対称差集合(^)を使います。

mistake2_ng.py
python_users = {'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー'}
java_users   = {'草薙京', 'テリー・ボガード', 'ゲーニッツ', '八神庵'}

# 「Pythonだけ使うユーザー」のつもりが逆になっている
only_python = java_users - python_users
print(only_python)
python3 mistake2_ng.py
{'ゲーニッツ'}
mistake2_ok.py
python_users = {'八神庵', '草薙京', 'テリー・ボガード', 'ブルー・マリー'}
java_users   = {'草薙京', 'テリー・ボガード', 'ゲーニッツ', '八神庵'}

# python_users - java_users が「Pythonだけ使うユーザー」
only_python = python_users - java_users
print(only_python)
python3 mistake2_ok.py
{'ブルー・マリー'}

概要

セットの集合演算はメソッドと演算子のどちらでも実行できます。演算子(|, &, -, ^)の場合は両辺がセットである必要がありますが、メソッドの場合は引数にリストやタプルなどのイテラブルも渡せます。

集合演算はいずれも元のセットを変更せず、新しいセットを返します。元のセット自体を更新したい場合は『|=』『&=』『-=』『^=』などのインプレース演算子、またはそれに対応するメソッド(『update()』『intersection_update()』など)を使えます。

差集合は順序に依存します。『A - B』と『B - A』は異なる結果になります。どちらにも含まれない要素を取得したい場合は対称差集合(^)を使ってください。

セットの包含関係の確認は『セット.issubset() / セット.issuperset() / セット.isdisjoint()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。