Pythonのset(セット)とは?基本的な使い方や集合演算をわかりやすく解説

Pythonのsetは、重複を許さないコレクション型のデータ構造です。
数学の集合概念をプログラミングで扱えるので、大量のデータから重複を除去したり、複数のデータセットから共通項目を抽出したりする際に威力を発揮します。
和集合・積集合・差集合などの集合演算を簡単に実行でき、データ処理の効率アップに役立ちます。
本記事では、setの基本的な使い方から応用的な集合演算まで、実践的なコード例を交えて詳しく解説します。
Contents
Pythonのset(セット)とは?
Pythonのsetは、重複のない要素を格納できるデータ構造で、順序がなく、重複を自動排除します。
動作が高速なので、大量のユーザーIDから重複を除去したり、複数のグループに共通する項目を抽出したりするのに便利です。
他のデータ構造と比較すると、リストやタプルは順序と重複を許し、辞書はキーと値のペアを扱いますが、setは値のみを格納します。setに格納できるのは、数値や文字列、タプルなどのハッシュ可能なオブジェクトです。
setの基本的な使い方について
setの初期化や要素の追加・削除などの基本的な操作を見ていきましょう。
setの作成
空のsetを作る場合はset()を使用します。波括弧{}だけでは空の辞書と解釈されるため注意が必要です。
# 空のsetを作成
empty_set = set() # 正しい方法
not_a_set = {} # setではなく辞書になる
# 要素を含むsetの作成
numbers = {1, 2, 3, 4, 5}
fruits = set([‘apple’, ‘banana’, ‘orange’])
chars = set(‘hello’) # 文字列から作成すると {‘h’, ‘e’, ‘l’, ‘o’} になる
# 重複は自動的に除去される
duplicates = {1, 2, 2, 3, 3, 3} # 結果は {1, 2, 3}
内包表記を使うと、既存のリストなどから条件に合う要素だけを含むsetを作成できます。
# リストから偶数のみを選びsetを作成
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = {x for x in numbers if x % 2 == 0} # {2, 4, 6}
# 文字列の長さをsetで管理
words = [‘apple’, ‘banana’, ‘kiwi’, ‘orange’]
word_lengths = {len(word) for word in words} # {5, 6}
# setの内包表記は重複を自動で排除します
chars = ‘abracadabra’
unique_chars = {char for char in chars} # {‘a’, ‘b’, ‘r’, ‘c’, ‘d’}
要素の追加・削除(add・remove)
setに要素を追加するにはadd()メソッドを使用します。
複数の要素を追加する場合はupdate()メソッドが便利です。
# 要素の追加
fruits = {‘apple’, ‘banana’}
fruits.add(‘orange’) # {‘apple’, ‘banana’, ‘orange’}
# 複数要素の追加
fruits.update([‘grape’, ‘melon’]) # {‘apple’, ‘banana’, ‘orange’, ‘grape’, ‘melon’}
# 要素の削除
fruits.remove(‘banana’) # 要素が存在しない場合はKeyError
fruits.discard(‘kiwi’) # 要素が存在しなくてもエラーにならない
# 任意の要素を取り出して削除
item = fruits.pop() # どの要素が取り出されるかは予測不可能
# すべての要素を削除
fruits.clear() # 空のsetになる
要素を削除する際、remove()は存在しない要素を指定するとエラーになるため、注意が必要です。
要素の確認(print)
setの内容を確認するには、単純にprint()関数を使用するか、要素の存在確認や要素数の取得などの操作をおこないます。
colors = {‘red’, ‘green’, ‘blue’}
# setの内容を表示
print(colors) # {‘red’, ‘green’, ‘blue’} と表示される
# 要素の存在確認
if ‘red’ in colors:
print(‘redが含まれています’)
# 要素数の取得
print(len(colors)) # 3
# ループ処理
for color in colors:
print(color) # 各要素を表示(順序は保証されない)
setをループ処理する際は、リストと違って要素の順序が保証されていない点に注意が必要です。
集合演算について
数学の集合演算と同様の操作をsetに対しておこなえます。
Pythonでは演算子とメソッドを用意しており、同じ結果が得られます。
結果は新しいsetオブジェクトとして返され、元のsetは変更されません。
和集合(union)
和集合は2つ以上の集合を統合し、すべての要素を含む新しい集合を作成する操作です。
Pythonでは「|」演算子またはunion()メソッドを使って和集合を取得できます。
set_a = {1, 2, 3}
set_b = {3, 4, 5}
# 演算子による和集合
result1 = set_a | set_b # {1, 2, 3, 4, 5}
# メソッドによる和集合
result2 = set_a.union(set_b) # {1, 2, 3, 4, 5}
3つ以上のsetに対しても一度に和集合を取得できます。
set_c = {5, 6, 7}
# 結果はいずれも {1, 2, 3, 4, 5, 6, 7}
result1 = set_a | set_b | set_c
result2 = set_a.union(set_b, set_c)
積集合(intersection)
積集合は2つ以上の集合に共通して含まれる要素だけを抽出します。
例えば、複数のアンケート結果から共通する回答を見つける際に活用できます。
積集合は「&」演算子またはintersection()メソッドで取得します。
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 演算子による積集合
result1 = set_a & set_b # {3, 4}
# メソッドによる積集合
result2 = set_a.intersection(set_b) # {3, 4}
差集合(difference)
一方の集合から他方の集合に含まれる要素を取り除いた集合を作成します。
例えば、新規顧客のみのリストを作成する場合に役立ちます。
差集合は「-」演算子またはdifference()メソッドで取得できます。
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7}
# 演算子による差集合
result1 = set_a – set_b # {1, 2, 3}
result2 = set_b – set_a # {6, 7}
# ※ 順序によって、結果が異なる点に注意
# メソッドによる差集合
result3 = set_a.difference(set_b) # {1, 2, 3}
対称差(symmetric_difference)
対称差は2つの集合のうち、どちらか一方にだけ含まれる要素を集めた集合を作成する操作です。
例えば、2つのデータセットの違いを見つける場合に活用できます。
対称差は「^」演算子またはsymmetric_difference()メソッドで取得します。
set_a = {1, 2, 3, 4}
set_b = {3, 4, 5, 6}
# 演算子による対称差
result1 = set_a ^ set_b # {1, 2, 5, 6}
# メソッドによる対称差
result2 = set_a.symmetric_difference(set_b) # {1, 2, 5, 6}
まとめ
setは要素の重複を自動で排除し、高速な検索が可能なPythonのデータ構造です。基本操作や集合演算を使いこなすと、データ処理の効率が大きく向上します。
まずは簡単な集合操作から始めて、setの活用法を身につけていきましょう。