集合(set)は、重複のない要素を格納するデータ構造です。数学の集合と同じ概念で、和集合・積集合・差集合などの集合演算ができます。データの重複排除やメンバーシップ判定に非常に便利です。
この記事では、集合の作成方法から、集合演算、実践的な活用方法まで詳しく解説します。
基本的な使い方
集合は波括弧 {} または set() 関数で作成します。
Python
# 集合の作成
fruits = {"りんご", "バナナ", "みかん"}
print(fruits)
# 重複は自動的に除去される
numbers = {1, 2, 2, 3, 3, 3}
print(numbers)
# リストから重複を除去
data = [1, 3, 2, 1, 4, 2, 5, 3]
unique = set(data)
print(f"元: {data}")
print(f"重複除去: {unique}")
# 空の集合はset()で作る
empty = set()
print(type(empty))
実行結果
{'バナナ', 'りんご', 'みかん'}
{1, 2, 3}
元: [1, 3, 2, 1, 4, 2, 5, 3]
重複除去: {1, 2, 3, 4, 5}
<class 'set'>
集合の要素に順序はない
集合はリストやタプルと異なり、要素の順序が保証されません。インデックスでのアクセスもできません。順序が必要な場合はリストを使いましょう。
要素の追加と削除
Python
colors = {"赤", "青"}
# 追加
colors.add("緑")
print(colors)
# 既存の要素を追加しても変化なし
colors.add("赤")
print(colors)
# 削除
colors.remove("青")
colors.discard("黄") # なくてもエラーにならない
print(colors)
実行結果
{'赤', '青', '緑'}
{'赤', '青', '緑'}
{'赤', '緑'}
集合演算
集合の最大の強みは、集合演算が簡単にできることです。
Python
a = {1, 2, 3, 4, 5}
b = {4, 5, 6, 7, 8}
# 和集合(どちらかに含まれる)
print(f"和集合: {a | b}")
# 積集合(両方に含まれる)
print(f"積集合: {a & b}")
# 差集合(aにあってbにない)
print(f"差集合: {a - b}")
# 対称差(片方にだけ含まれる)
print(f"対称差: {a ^ b}")
# 部分集合の判定
c = {1, 2, 3}
print(f"{c} は {a} の部分集合: {c <= a}")
実行結果
和集合: {1, 2, 3, 4, 5, 6, 7, 8}
積集合: {4, 5}
差集合: {1, 2, 3}
対称差: {1, 2, 3, 6, 7, 8}
{1, 2, 3} は {1, 2, 3, 4, 5} の部分集合: True
メンバーシップ判定の高速性
集合の in 演算子はリストより格段に速いです。リストはO(n)ですが、集合はO(1)で判定できます。大量のデータから検索する場合は、集合に変換してから判定すると効率的です。
実践的な使い方
Python
# 共通の趣味を見つける
user_a = {"読書", "映画", "料理", "旅行"}
user_b = {"映画", "ゲーム", "旅行", "音楽"}
common = user_a & user_b
only_a = user_a - user_b
only_b = user_b - user_a
print(f"共通の趣味: {common}")
print(f"Aだけの趣味: {only_a}")
print(f"Bだけの趣味: {only_b}")
# リストの重複チェック
emails = ["a@test.com", "b@test.com", "a@test.com", "c@test.com"]
if len(emails) != len(set(emails)):
print(f"重複あり! ユニーク数: {len(set(emails))}/{len(emails)}")
実行結果
共通の趣味: {'旅行', '映画'}
Aだけの趣味: {'読書', '料理'}
Bだけの趣味: {'音楽', 'ゲーム'}
重複あり! ユニーク数: 3/4
まとめ
- 集合は重複のない要素を格納するデータ構造
|(和集合)、&(積集合)、-(差集合)で集合演算ができるadd()で追加、remove()/discard()で削除in演算子によるメンバーシップ判定がリストより高速- リストの重複排除に
set()が便利