Python 集合 (Python Sets)

PythonBeginner
オンラインで実践に進む

はじめに

Python の集合(Set)に関するこの実験(Lab)へようこそ!Python には、リスト、辞書、タプル、そして集合(Set)といった、データを整理するための組み込みデータ型がいくつか用意されています。

公式の Python ドキュメントによると、集合(Set)とは、重複する要素を持たない順序付けられていないコレクションです。その主な用途は、メンバーシップのテスト(要素が含まれているかの確認)と、重複エントリの排除です。

この実験では、一連の実践的な演習を通じて、集合を効果的に作成、操作、および使用する方法を探求します。

集合の初期化 (Initializing a Set)

このステップでは、Python でセットを作成する 2 つの主要な方法、すなわち波括弧 {} を使用する方法と、組み込みの set() 関数を使用する方法について学習します。空の波括弧 {} を使用すると、空のセットではなく空の辞書(dictionary)が作成されることを理解しておくことが重要です。

注記: WebIDE(VS Code のようなもの)の使用に慣れていない場合は、まずこちらの実験(lab)で学習してください。

まず、左側のファイルエクスプローラーから step1.py ファイルを開きます。

次に、以下のコードを step1.py にコピー&ペーストしてください。このコードは、セットの作成方法を示し、空のセットを作成する場合の特殊なケースを強調しています。

## Create set using curly braces or set() function
s_braces = {1, 2, 3}
print(f"Set with braces: {s_braces}, type: {type(s_braces)}")

s_func = set([1, 2, 3])
print(f"Set with function: {s_func}, type: {type(s_func)}")

## Warning: empty {} creates a dictionary, not a set
s_dict = {}
print(f"Empty braces create a: {type(s_dict)}")

## To create an empty set, you must use set()
s_empty = set()
print(f"To create an empty set use set(): {type(s_empty)}")

ファイルを保存し、ターミナルで以下のコマンドを実行して実行します。

python3 step1.py

作成されたオブジェクトの型を確認する、以下の出力が表示されるはずです。{} が <class 'dict'> になることに注意してください。

Set with braces: {1, 2, 3}, type: <class 'set'>
Set with function: {1, 2, 3}, type: <class 'set'>
Empty braces create a: <class 'dict'>
To create an empty set use set(): <class 'set'>

集合の特性の理解 (Understanding Set Properties)

このステップでは、集合の核となる特性を探求します。集合は、一意性(ユニークさ)を自動的に強制し、順序がないため強力です。これは、集合が重複する値を自動的に削除することを意味し、インデックスを使用して要素にアクセスすることはできません。

step2.py ファイルを開いてください。

以下のコードを step2.py にコピー&ペーストします。コードの最初の部分は、重複がどのように処理されるかを示し、2 番目の部分は、集合にインデックスを付けようとした場合に何が起こるかを示します。

## Sets automatically remove duplicates
s_duplicates = {1, 2, 3, 2, 3, 4}
print(f"Original with duplicates: {{1, 2, 3, 2, 3, 4}}")
print(f"Set with duplicates removed: {s_duplicates}")

## Sets are unordered and cannot be indexed
print("\nAttempting to access a set by index...")
try:
    s = {1, 2, 3}
    s[0]
except TypeError as e:
    print(f"Error when indexing: {e}")

それでは、ターミナルからスクリプトを実行します。

python3 step2.py

出力は次のようになります。

Original with duplicates: {1, 2, 3, 2, 3, 4}
Set with duplicates removed: {1, 2, 3, 4}

Attempting to access a set by index...
Error when indexing: 'set' object is not subscriptable

ご覧のとおり、重複する 2 と 3 は自動的に削除されました。s[0] へのアクセス試行は TypeError を引き起こし、集合がインデックス参照をサポートしていないことが確認されました。

要素の追加と更新 (Adding and Updating Elements)

このステップでは、既存の集合に新しい要素を追加する方法を学びます。Python では、これを行うための主要な 2 つのメソッドが提供されています。単一の要素を追加するための add() と、イテラブル(リストや別の集合など)から複数の要素を追加するための update() です。

step3.py ファイルを開いてください。

以下のコードを step3.py にコピー&ペーストします。このコードは、まず集合を作成し、次に単一の要素を追加し、最後に複数の要素で更新します。

## Start with a set
s = {1, 2, 3}
print(f"Original set: {s}")

## add() method: add a single element
s.add(4)
print(f"After adding 4: {s}")

## update() method: add multiple elements from an iterable
s.update([2, 3, 4, 5, 6])  ## Duplicates like 2, 3, 4 are ignored
print(f"After updating with [2, 3, 4, 5, 6]: {s}")

ターミナルからスクリプトを実行します。

python3 step3.py

出力は次のようになるはずです。update() を使用する場合、すでに集合内に存在する要素は単に無視されることに注意してください。

Original set: {1, 2, 3}
After adding 4: {1, 2, 3, 4}
After updating with [2, 3, 4, 5, 6]: {1, 2, 3, 4, 5, 6}

要素の削除と破棄 (Removing and Discarding Elements)

このステップでは、集合から要素を削除する 2 つの方法、remove() と discard() について学びます。どちらの方法も要素を削除しますが、要素が見つからなかった場合の動作が異なります。remove() は KeyError を発生させ、適切に処理しないとプログラムがクラッシュする可能性がありますが、discard() は何もしないでサイレントに処理を続行します。

step4.py ファイルを開いてください。

両方のメソッドの動作を示す以下のコードをコピー&ペーストします。

## remove() method: raises KeyError if element is not found
s = {1, 2, 3}
print(f"Original set: {s}")
s.remove(3)
print(f"After removing 3: {s}")

## Trying to remove an element that doesn't exist with remove()
try:
    s.remove(3)
except KeyError as e:
    print(f"Error when removing 3 again: KeyError: {e}")

## discard() method: does not raise an error if element is not found
s = {1, 2, 3}
print(f"\nNew original set: {s}")
s.discard(3)
print(f"After discarding 3: {s}")
s.discard(3) ## No error is raised
print(f"After discarding 3 again (no error): {s}")

ターミナルからスクリプトを実行します。

python3 step4.py

出力は違いを明確に示しています。

Original set: {1, 2, 3}
After removing 3: {1, 2}
Error when removing 3 again: KeyError: 3

New original set: {1, 2, 3}
After discarding 3: {1, 2}
After discarding 3 again (no error): {1, 2}

remove() と discard() のどちらを選択するかは、要素が存在しない場合にプログラムを明示的に失敗させたいか、それともその不在を優雅に処理したいかによって決まります。

集合演算 (Set Operations)

この最終ステップでは、最も一般的な集合演算を練習します。これらの演算により、集合を強力な方法で結合および比較できます。メソッド構文(例:s1.union(s2))と演算子構文(例:s1 | s2)の両方を使用します。

  • 和集合 (Union) (union() または |): 提供された集合のすべての要素を含む新しい集合を作成します。
  • 積集合 (Intersection) (intersection() または &): すべての集合に共通する要素のみを含む新しい集合を返します。
  • 差集合 (Difference) (difference() または -): 最初の集合には存在するが、2 番目の集合には存在しない要素を含む新しい集合を返します。
  • 対称差集合 (Symmetric Difference) (symmetric_difference() または ^): いずれかの集合には存在するが、両方には存在しない要素を含む新しい集合を返します。

step5.py ファイルを開いてください。

以下のコードをコピー&ペーストして、2 つのサンプル集合に対してこれら 4 つの演算を実行します。

s1 = {1, 2, 3}
s2 = {2, 3, 4}
print(f"s1 = {s1}")
print(f"s2 = {s2}\n")

## union() or |
## Returns a new set containing all items from both sets.
print(f"Union (s1 | s2): {s1.union(s2)}")

## intersection() or &
## Returns a new set containing items common to both sets.
s3 = {3, 4, 5}
print(f"Intersection (s1 & s2): {s1.intersection(s2)}")

## difference() or -
## Returns a new set containing items in the first set but not in the second.
print(f"Difference (s1 - s2): {s1.difference(s2)}")
print(f"Difference (s2 - s1): {s2.difference(s1)}")

## symmetric_difference() or ^
## Returns a new set with elements in either set, but not both.
print(f"Symmetric Difference (s1 ^ s2): {s1.symmetric_difference(s2)}")

ターミナルからスクリプトを実行します。

python3 step5.py

各演算の結果を理解するために出力を確認してください。

s1 = {1, 2, 3}
s2 = {2, 3, 4}

Union (s1 | s2): {1, 2, 3, 4}
Intersection (s1 & s2): {2, 3}
Difference (s1 - s2): {1}
Difference (s2 - s1): {4}
Symmetric Difference (s1 ^ s2): {1, 4}

まとめ

この実験(Lab)では、Python の集合(Set)の基礎を学びました。まず、波括弧 {} と set() 関数の両方を使用して集合を初期化し、空の集合を作成する際の重要な違いに注目しました。次に、集合の基本的な特性、すなわち順序がなく、一意な要素のみを格納することを調査しました。要素の追加には add() と update() を、削除には remove() と discard() メソッドを使用し、それらの間の重要な違いを理解しながら、集合の変更を練習しました。最後に、和集合 (|)、積集合 (&)、差集合 (-)、対称差集合 (^) を含む必須の集合演算を実行しました。これで、Python プログラムで一意なアイテムのコレクションを扱うための集合を使用する強固な基盤ができました。