基礎

Pythonの集合(set)|重複を排除してデータを管理する

集合(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() が便利