Pythonにはデータの重複を簡単に排除し、効率的に集合演算を行えるset
というデータ構造があります。この記事では、set
の基礎から実用的な使い方まで、わかりやすく解説します。
Pythonのset
とは?
set
は、一意の要素を持つ順序がないコレクション型データ構造です。数学の集合を基にしており、重複を許さず、集合演算や高速な検索が可能です。
set
の主な特徴
- 重複しない
- 同じ値は1回だけ保持されます。
- 順序がない
- 要素の順序は保証されません(例:
{3, 1, 2}
と表示される場合も{1, 2, 3}
と表示される場合もある)。
- 要素の順序は保証されません(例:
- 変更可能
- 要素の追加や削除ができます。
- 高速操作
- ハッシュテーブルを利用しており、リストよりも検索・削除が効率的です。
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
を使いこなして、効率的なコードを目指しましょう!