Python 集合 (Set)
セット(Sets)は、Python においてユニークな要素の集合を格納するための基礎的なデータ構造です。
データ内に重複した値が存在しないことを保証したい場合や、和集合、積集合、差集合といった数学的な集合演算を実行する必要がある場合に非常に便利です。
1. セット(Sets)の理解
セットは、独立したハッシュ可能 (hashable) なオブジェクトの順不同 (unordered) な集合です。
- 順不同 (Unordered): セット内の要素には特定の順序やインデックスがありません。これはリスト(Lists)やタプル(Tuples)とは異なる点です。
- ユニーク (Distinct/Unique): セットはユニークな要素のみを保持します。重複した値は自動的に破棄されます。
- ハッシュ可能 (Hashable): セットの要素はイミュータブル (immutable) である必要があります(例:数値、文字列、タプル)。リストや辞書はハッシュ可能ではないため、セットの要素にすることはできません。
2. セットの作成
Python では、主に 2 つの方法でセットを作成できます。
2.1 波括弧 {} を使用する
# 整数セットを作成
my_set = {1, 2, 3, 4, 5}
print(my_set) # 出力: {1, 2, 3, 4, 5}
# 文字列セットを作成
string_set = {"apple", "banana", "cherry"}
print(string_set) # 出力: {'apple', 'banana', 'cherry'} (出力順序は変わる可能性があります)2.2 set() コンストラクタを使用する
# リストからセットを作成
my_list = [1, 2, 2, 3, 4, 4, 5]
my_set = set(my_list)
print(my_set) # 出力: {1, 2, 3, 4, 5} (重複が自動的に削除される)
# 空のセットを作成
empty_set = set()
print(empty_set) # 出力: set() 重要なヒント: 空の波括弧 {} を使用すると、空の辞書 (Dictionary) が作成されます。空のセットを作成するには、必ず set() コンストラクタを使用してください。
3. 要素の追加と削除
セットはミュータブル (mutable) であり、作成後に要素を追加または削除できます。
3.1 要素の追加
- add(element): セットに単一の要素を追加します。
my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # 出力: {1, 2, 3, 4}
my_set.add(3) # 既に存在する要素を追加しても変化はありません
print(my_set) # 出力: {1, 2, 3, 4}- update(iterable): リスト、タプル、別のセットなどのイテラブルオブジェクトから複数の要素をまとめて追加します。
my_set = {1, 2, 3}
my_set.update([4, 5, 6])
print(my_set) # 出力: {1, 2, 3, 4, 5, 6}
my_set.update((7, 8))
print(my_set) # 出力: {1, 2, 3, 4, 5, 6, 7, 8}
my_set.update({9, 10})
print(my_set) # 出力: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}3.2 要素の削除
- remove(element): 指定した要素を削除します。要素が見つからない場合は
KeyErrorが発生します。
my_set = {1, 2, 3, 4}
my_set.remove(3)
print(my_set) # 出力: {1, 2, 4}
# my_set.remove(5) # KeyError: 5 が発生 (要素が見つからないため)- discard(element): 指定した要素を削除します(存在する場合)。要素が見つからなくてもエラーは発生しません。
my_set = {1, 2, 3, 4}
my_set.discard(3)
print(my_set) # 出力: {1, 2, 4}
my_set.discard(5) # エラーは発生しません
print(my_set) # 出力: {1, 2, 4}- pop(): セットから任意の要素を 1 つ削除し、その値を返します。セットが空の場合は
KeyErrorが発生します。順不同であるため、どの要素が削除されるかは予測できません。
my_set = {1, 2, 3, 4}
element = my_set.pop()
print(element) # 出力: (例: 1 - 結果は変わる可能性があります)
print(my_set) # 出力: (例: {2, 3, 4} - 結果は変わる可能性があります)
empty_set = set()
# empty_set.pop() # KeyError: 'pop from an empty set' が発生- clear(): すべての要素を削除し、空のセットにします。
my_set = {1, 2, 3, 4}
my_set.clear()
print(my_set) # 出力: set()4. セットの数学的演算
セットは多様な数学的演算をサポートしており、プログラミングの多くの場面で実用的です。
4.1 和集合 (Union)
2 つのセットのすべての要素を含む新しいセットを作成します。
|演算子を使用:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1 | set2
print(union_set) # 出力: {1, 2, 3, 4, 5}union()メソッドを使用:
union_set = set1.union(set2)
print(union_set) # 出力: {1, 2, 3, 4, 5}4.2 積集合 (Intersection)
両方のセットに共通して存在する要素のみを含む新しいセットを作成します。
&演算子を使用:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
intersection_set = set1 & set2
print(intersection_set) # 出力: {3}intersection()メソッドを使用:
intersection_set = set1.intersection(set2)
print(intersection_set) # 出力: {3}4.3 差集合 (Difference)
最初のセットには存在するが、2 番目のセットには存在しない要素を含む新しいセットを作成します。
-演算子を使用:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
difference_set = set1 - set2
print(difference_set) # 出力: {1, 2}difference()メソッドを使用:
difference_set = set1.difference(set2)
print(difference_set) # 出力: {1, 2}4.4 対称差 (Symmetric Difference)
どちらか一方のセットには含まれるが、両方には含まれない要素(積集合を除いた部分)を含む新しいセットを作成します。
^演算子を使用:
set1 = {1, 2, 3}
set2 = {3, 4, 5}
symmetric_difference_set = set1 ^ set2
print(symmetric_difference_set) # 出力: {1, 2, 4, 5}symmetric_difference()メソッドを使用:
symmetric_difference_set = set1.symmetric_difference(set2)
print(symmetric_difference_set) # 出力: {1, 2, 4, 5}4.5 部分集合と上位集合
- 部分集合 (Subset): あるセットのすべての要素が別のセットに含まれている場合、そのセットはもう一方のセットの部分集合です。
set1 = {1, 2}
set2 = {1, 2, 3}
print(set1 <= set2) # 出力: True (set1 は set2 の部分集合)
print(set1.issubset(set2)) # 出力: True- 上位集合 (Superset): あるセットが別のセットのすべての要素を含んでいる場合、そのセットはもう一方のセットの上位集合です。
set1 = {1, 2, 3}
set2 = {1, 2}
print(set1 >= set2) # 出力: True (set1 は set2 の上位集合)
print(set1.issuperset(set2)) # 出力: True5. セット内包表記
リスト内包表記と同様に、セット内包表記を使用すると簡潔にセットを生成できます。
# 1 から 5 までの数値の平方を含むセットを作成
squares = {x**2 for x in range(1, 6)}
print(squares) # 出力: {1, 4, 9, 16, 25}
# リストから偶数のみを抽出して新しいセットを作成
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = {x for x in numbers if x % 2 == 0}
print(even_numbers) # 出力: {2, 4, 6, 8, 10}6. 実践的なケースとデモンストレーション
セットをどのように活用して一般的なプログラミング上の問題を解決するか、実践的な例を見てみましょう。
6.1 リストから重複を削除する
セットの最も一般的な用途の 1 つは、リストから重複要素を取り除くことです。
my_list = [1, 2, 2, 3, 4, 4, 5, 5, 5]
unique_list = list(set(my_list)) # セットに変換してからリストに戻す
print(unique_list) # 出力: [1, 2, 3, 4, 5]6.2 2 つのリストの共通要素を見つける
セットを使用すると、2 つのリスト間の共通要素を効率的に特定できます。
list1 = [1, 2, 3, 4, 5]
list2 = [3, 5, 6, 7, 8]
set1 = set(list1)
set2 = set(list2)
common_elements = list(set1.intersection(set2))
print(common_elements) # 出力: [3, 5]6.3 メンバーシップ確認 (Membership)
セットは、特定の要素が含まれているかどうかを非常に高速に確認する手段を提供します。
my_set = {1, 2, 3, 4, 5}
print(3 in my_set) # 出力: True
print(6 in my_set) # 出力: False6.4 テキストデータの分析
ドキュメント内で使われているユニークな単語を抽出するなど、テキスト分析にも有効です。
text = "This is a sample text. This text is used to demonstrate set operations."
words = text.lower().replace('.', '').split() # 小文字化、記号削除、分割
unique_words = set(words)
print(unique_words)
# 出力: {'a', 'is', 'text', 'to', 'sample', 'demonstrate', 'set', 'used', 'this', 'operations'}
print(len(unique_words)) # 出力: 10