Pythonのsetを徹底解説!データの重複排除と効率的な操作を実現する便利なデータ構造

Pythonにはデータの重複を簡単に排除し、効率的に集合演算を行えるsetというデータ構造があります。この記事では、setの基礎から実用的な使い方まで、わかりやすく解説します。

sea night moon set

Pythonのsetとは?

setは、一意の要素を持つ順序がないコレクション型データ構造です。数学の集合を基にしており、重複を許さず、集合演算や高速な検索が可能です。

setの主な特徴

  1. 重複しない
    • 同じ値は1回だけ保持されます。
  2. 順序がない
    • 要素の順序は保証されません(例: {3, 1, 2}と表示される場合も {1, 2, 3}と表示される場合もある)。
  3. 変更可能
    • 要素の追加や削除ができます。
  4. 高速操作
    • ハッシュテーブルを利用しており、リストよりも検索・削除が効率的です。

setの基本操作

setの作成方法

Pythonでは、波括弧{}set()を使ってsetを作成できます。

# 波括弧を使う
s1 = {1, 2, 3}

# set()を使う
s2 = set([1, 2, 3, 3])  # リストから作成

# 空のセットを作る
empty_set = set()

# 注意: {} は辞書型を表します
empty_dict = {}
print(type(empty_dict))  # 出力: <class 'dict'>

要素の追加と削除

# 要素の追加
s = {1, 2}
s.add(3)  # s = {1, 2, 3}

# 要素の削除
s.remove(2)  # 指定した要素が存在しない場合はエラー
s.discard(4)  # 指定した要素が存在しなくてもエラーにならない

要素の存在確認

s = {1, 2, 3}
print(1 in s)  # 出力: True
print(4 in s)  # 出力: False

集合演算を使った高度な操作

Pythonのsetは、数学的な集合演算を簡単に行うことができます。

和集合

2つの集合を合体させ、重複を排除した結果を返します。

s1 = {1, 2, 3}
s2 = {3, 4, 5}
print(s1 | s2)  # 出力: {1, 2, 3, 4, 5}

積集合

両方の集合に共通する要素を取り出します。

print(s1 & s2)  # 出力: {3}

差集合

片方の集合にしか含まれない要素を取り出します。

print(s1 - s2)  # 出力: {1, 2}

対称差集合

どちらか一方のみに含まれる要素を取り出します。

print(s1 ^ s2)  # 出力: {1, 2, 4, 5}

frozenset: 変更不可能なset

frozensetは、変更不可(イミュータブル)な集合です。これにより、辞書のキーやsetの要素として使用できます。

frozensetの例

fs = frozenset([1, 2, 3])
my_dict = {fs: "value"}
print(my_dict[fs])  # 出力: value

setの性能を検証!リストとの比較

setは、リストよりも検索や削除が高速です。以下の例では、リストとsetの検索速度を比較します。

コード例

import time

lst = [i for i in range(1_000_000)]
s = set(lst)

# リストで検索
start = time.time()
999_999 in lst
print("リスト検索時間:", time.time() - start)
# リスト検索時間: 0.008037567138671875

# セットで検索
start = time.time()
999_999 in s
print("セット検索時間:", time.time() - start)
# セット検索時間: 0.0

結果

setの検索はリストより圧倒的に速く、データ量が増えるほど差が顕著になります。この性能は、ハッシュテーブルを活用しているためです。

実用的な活用例

1. 重複要素の排除

リストから重複を簡単に排除できます。

numbers = [1, 2, 2, 3, 3, 4]
unique_numbers = set(numbers)
print(unique_numbers)  # 出力: {1, 2, 3, 4}

2. リストの共通要素を見つける

2つのリスト間で共通する要素を取得します。

list1 = [1, 2, 3]
list2 = [3, 4, 5]
common = set(list1) & set(list2)
print(common)  # 出力: {3}

3. ユニークな単語のカウント

文章内の重複しない単語数を数えます。

text = "the quick brown fox jumps over the lazy dog"
words = set(text.split())
print(len(words))  # 出力: 8

まとめ

Pythonのsetは、データの重複排除や効率的な操作を実現する便利なデータ構造です。特に以下のような場面で活用できます。

  • データの重複を排除したいとき
  • 複数のリストや集合の共通要素や差を求めたいとき
  • 高速な検索やデータ管理が必要なとき

さらに、変更不可のfrozensetを活用すれば、データの不変性を保証しながら集合演算の力を活用できます。Pythonプログラミングでsetを使いこなして、効率的なコードを目指しましょう!

上部へスクロール