MQL5システムトレーダーの為のPython講座:第9回「集合について」

Python
スポンサーリンク
スポンサーリンク

はじめに

前回Python辞書型について学びました。

今回は「集合」について解説します。集合は、重複のないデータを扱う際に有用なデータ型で、順序を持たない要素の集まりです。集合の作り方から基本的な使い方までを解説していきます。

集合とは

集合とは、ある条件を満たす「集まり」のことです。Pythonデータ型の一つで、リストタプルとは異なる特徴を持ちます。
集合に含まれる要素には順番がありません。また、要素が重複することに意味はなく、同じ要素が複数あっても、それらは自動的に一つにまとめられます。たとえば、リストでは同じ値が複数存在してもそのまま保持されますが、集合の場合は同じ要素があればまとめられてしまいます。

Python集合を使う理由はいくつかありますが、その中でも「重複した要素を簡単に削除できること」が特に便利です。たとえば、データの中に重複した要素がたくさんあるとき、それを一つずつ削除するのは面倒ですが、集合に変換することで、自動的に重複を削除できます。

集合を使うときの具体的な例として、次のような場面が考えられます:

  • 名簿に名前が重複していないかチェックする場合
  • 大量のデータからユニーク(重複しない)な値だけを抽出したい場合

これらのように、集合はデータの整理や重複の除去に役立ちます。

集合の作り方

Python集合を作る方法はいくつかありますが、最も基本的な方法は波括弧を使う方法です。ここでは集合の作り方について説明します。

基本的な集合の作り方

集合は、リストタプルと似た形で、波括弧の中に要素をカンマで区切って入れることで作成します。ただし、集合にはリストと違い順番がないため、表示される順番は毎回異なる可能性があります。

以下に基本的な集合の作り方を示します:

# 集合を作成する
S = {1, 2, 3, 4, 4, 5}  # 重複した要素「4」が含まれています

# 集合を表示する
print(S)  # 集合には重複した要素が含まれないため、「4」は一つにまとめられます

実行結果

{1, 2, 3, 4, 5}

異なるデータ型を持つ集合

集合には、異なるデータ型要素を含めることが可能です。たとえば、整数(int)、小数(float)、文字列(str)など、さまざまな型のデータを同じ集合に含めることができます。

# 異なるデータ型を持つ集合を作成する
mixed_set = {1, 3.14, "Python", (1, 2)}  # 整数、浮動小数点数、文字列、タプルが含まれています

# 集合を表示する
print(mixed_set)  # 全てのデータ型が同じ集合に含まれています

注意集合の中には「ミュータブル(変更可能)なオブジェクト」、例えばリスト辞書を含めることはできません。以下のコードではエラーが発生します。

# リストを含む集合を作ろうとするとエラーが発生します
try:
    invalid_set = {1, [2, 3]}  # リストは集合に含めることができないためエラーになります
except TypeError as e:
    print(e)  # エラー内容を表示します

実行結果

unhashable type: 'list'

set() 関数を使った集合の作り方

波括弧以外にも、set() 関数を使って集合を作成することができます。この方法では、リストタプルといった他のデータ型集合に変換することができます。

# リストを集合に変換する
A = [1, 2, 2, 3, 4]  # リストには重複した「2」が含まれています
S = set(A)  # set() 関数を使ってリストを集合に変換します

# 集合を表示する
print(S)  # 重複した要素が削除されて表示されます

実行結果

{1, 2, 3, 4}

このように、リスト集合に変換することで、重複した要素が自動的に取り除かれ、ユニーク(重複しない)な要素だけを持つ集合が得られます。

空集合の作り方

集合を作るときには、set() 関数を使います。波括弧を使うと辞書と認識されてしまうため、空の集合を作るには必ずset() 関数を使う必要があります。

# 空集合を作成する
empty_set = set()  # set() 関数を使って空の集合を作成します

# 集合を表示する
print(empty_set)  # 空集合なので「set()」と表示されます

# 注意:波括弧 {} で定義すると辞書になります
empty_dict = {}
print(type(empty_dict))  # <class 'dict'> と表示され、辞書として認識されます

集合に要素を追加・削除する方法

集合に対しては、要素の追加や削除を行うことが可能です。ここでは、集合要素を追加したり、不要な要素を削除する方法を解説します。

要素の追加

集合に新しい要素を追加するには、add() メソッドを使用します。

add() メソッドについて

add() メソッドは、集合に新しい要素を追加するために使用します。集合の重複を許さない特性により、同じ要素を追加しようとした場合は無視されます。

# 集合を作成する
S = {1, 2, 3}

# 集合に新しい要素を追加する
S.add(4)  # 要素「4」を追加します
print(S)  # 集合に「4」が追加されました

実行結果

{1, 2, 3, 4}

要素の削除

集合から要素を削除するには、remove() メソッドを使用します。このメソッドを使うと、指定した要素集合から削除できます。ただし、削除しようとした要素集合に存在しない場合は、エラーが発生します。

# 集合を作成する
S = {1, 2, 3, 4}

# 集合から要素を削除する
S.remove(3)  # 要素「3」を削除します
print(S)  # 集合から「3」が削除されました

実行結果

{1, 2, 4}

また、集合からすべての要素を削除するには、clear() メソッドを使用します。このメソッドを使うと、集合の全ての要素が削除され、空の集合になります。

# 集合を作成する
S = {1, 2, 3, 4}

# 集合からすべての要素を削除する
S.clear()  # 集合を空にします
print(S)  # 空集合が表示されます

実行結果

set()

要素が存在しない場合の削除

集合から要素を削除する際に、remove() メソッドでは存在しない要素を指定するとエラーが発生します。このような場合にエラーを避けたい場合は、discard() メソッドを使うと便利です。

discard() メソッドについて

discard() メソッドは、指定した要素集合から削除します。remove()と異なり、削除しようとした要素が存在しない場合でもエラーを発生させないため、安全に要素を削除できます。

# 集合を作成する
S = {1, 2, 3}

# 集合から存在しない要素を削除しようとする
S.discard(4)  # 要素「4」は存在しませんが、エラーは発生しません
print(S)  # 元の集合がそのまま表示されます

実行結果

{1, 2, 3}

このように、集合では必要に応じて要素を追加したり削除したりできます。

要素の変更ができない集合: フローズンセット

今まで説明してきた集合は、要素の追加や削除が可能でした。しかし、要素を変更できない集合を作りたい場合には、フローズンセット(frozen set)を使用します。フローズンセットは、一度作成するとその要素を追加・削除することができないという特徴があります。

フローズンセットの作り方

フローズンセットを作成するには、frozenset() 関数を使います。この関数にリストタプル、他の集合を渡すことで、そのデータを元にフローズンセットを作成できます。

# リストのデータをもとにフローズンセットを作成する
A = [1, 2, 3, 4]  # リストを作成
frozen_S = frozenset(A)  # frozenset() 関数でフローズンセットを作成します

# フローズンセットを表示する
print(frozen_S)  # フローズンセットが表示されます

実行結果

frozenset({1, 2, 3, 4})

frozenset() 関数について

frozenset() 関数は、要素の追加や削除ができないフローズンセットを作成するための関数です。ミュータブルな集合と違い、フローズンセットは一度作成すると変更ができないため、データの一貫性が必要な場面で有効です。

フローズンセットは、通常の集合と似ていますが、次のような点で違いがあります:

  1. 要素の追加ができない
    通常の集合では add() メソッドを使って要素を追加できましたが、フローズンセットにはそのメソッドがありません。要素を追加しようとするとエラーになります。
  2. 要素の削除ができない
    通常の集合ではremove()discard() メソッドを使って要素を削除できましたが、フローズンセットにはこれらのメソッドもありません。要素を削除しようとするとエラーになります。
# フローズンセットに要素を追加しようとするとエラーが発生します
try:
    frozen_S.add(5)  # add() メソッドは使用できません
except AttributeError as e:
    print(e)  # エラー内容を表示します

# フローズンセットから要素を削除しようとしてもエラーが発生します
try:
    frozen_S.remove(1)  # remove() メソッドは使用できません
except AttributeError as e:
    print(e)  # エラー内容を表示します

実行結果

'frozenset' object has no attribute 'add'
'frozenset' object has no attribute 'remove'

フローズンセットの用途

フローズンセットは、要素を変更されたくない場合に使用します。例えば、何らかのシステムで変更されてはいけない定義や設定をデータとして扱いたい場合などに便利です。また、フローズンセット集合でありながら、辞書のキーなど変更ができないデータ型が求められる場所でも使うことができます。

フローズンセットを使うことで、意図しない要素の追加や削除を防ぎ、データの一貫性を維持することができます。

集合の演算

集合では、要素の集まりに対していくつかの演算ができます。Pythonでは、和集合積集合差集合対象差集合のような集合の演算を簡単に行うことができます。ここでは、それぞれの演算と使用する記号やメソッドについて説明します。

和集合

和集合とは、2つの集合の少なくともどちらか一方に含まれている全ての要素を含む集合です。
異なるデータセットを組み合わせて全体のデータを把握したいときに便利です。
Pythonでは、バーティカルライン(|)や union() メソッドを使って和集合を作成できます。

# 2つの集合を作成する
S1 = {1, 2, 3}
S2 = {3, 4, 5}

# 和集合を作成する
S_union = S1 | S2  # バーティカルラインを使う方法
print(S_union)  # {1, 2, 3, 4, 5}

# union() メソッドを使う方法
S_union_method = S1.union(S2)
print(S_union_method)  # {1, 2, 3, 4, 5}

union() メソッドについて

union() メソッドは、2つ以上の集合を合成し、全ての要素を含む和集合を作成するために使用します。重複した要素は一つにまとめられ、和集合が生成されます。

積集合

積集合とは、2つの集合の両方に共通して含まれる要素のみを持つ集合です。

共有された特性を持つ対象を特定したいときなどに有効です。

Pythonでは、アンパサンド(&)や intersection() メソッドを使って積集合を作成できます。

# 積集合を作成する
S_intersection = S1 & S2  # アンパサンドを使う方法
print(S_intersection)  # {3}

# intersection() メソッドを使う方法
S_intersection_method = S1.intersection(S2)
print(S_intersection_method)  # {3}

intersection() メソッドについて

intersection() メソッドは、2つ以上の集合の共通部分を抽出し、共通の要素のみを含む積集合を作成するために使用します。

差集合

差集合とは、一方の集合には含まれていて、他方の集合には含まれていない要素を持つ集合です。

異なるグループの間で排除すべき要素を識別したいときなどに利用します。

Pythonでは、マイナス(-)や difference() メソッドを使って差集合を作成できます。

# 差集合を作成する
S_difference = S1 - S2  # S1 には含まれていて S2 には含まれていない要素
print(S_difference)  # {1, 2}

# difference() メソッドを使う方法
S_difference_method = S1.difference(S2)
print(S_difference_method)  # {1, 2}

difference() メソッドについて

difference() メソッドは、指定した集合に含まれていない要素を抽出し、片方の集合にだけ含まれる要素を持つ差集合を作成するために使用します。

対象差集合

対象差集合とは、2つの集合のうちどちらか一方のみに含まれる要素を持つ集合です。

部分的に一致する条件に基づいて特定の対象を絞り込みたいときに役立ちます。

Pythonでは、ハット(^)や symmetric_difference() メソッドを使って対象差集合を作成できます。

# 対象差集合を作成する
S_symmetric_difference = S1 ^ S2  # ハットを使う方法
print(S_symmetric_difference)  # {1, 2, 4, 5}

# symmetric_difference() メソッドを使う方法
S_symmetric_difference_method = S1.symmetric_difference(S2)
print(S_symmetric_difference_method)  # {1, 2, 4, 5}

symmetric_difference() メソッドについて

symmetric_difference() メソッドは、2つの集合のどちらか一方のみに含まれる要素を持つ対象差集合を作成するために使用します。

集合の関係

集合同士の関係を理解することは、データ間の包含関係や重複の有無を確認するのに役立ちます。Pythonでは、集合部分集合かどうか、互いに等しいかどうか、真部分集合かどうかといった関係を確認するための演算が用意されています。ここでは、それぞれの関係を確認する方法について説明します。

部分集合の判定

集合A が集合B にすべて含まれている場合、集合A は集合B の「部分集合」と言います。Pythonでは、小なりイコール(<=)や issubset() メソッドを使って部分集合かどうかを判定することができます。

# 2つの集合を作成する
S1 = {1, 2, 3}
S2 = {1, 2, 3, 4, 5}

# S1 が S2 の部分集合かどうか判定する
is_subset = S1 <= S2  # 小なりイコールを使う方法
print(is_subset)  # True

# issubset() メソッドを使う方法
is_subset_method = S1.issubset(S2)
print(is_subset_method)  # True

issubset() メソッドについて

issubset() メソッドは、指定した集合が自身の集合を完全に包含しているかどうかを確認するために使用します。全ての要素が含まれていれば True を返します。

等しい集合の判定

2つの集合要素が全て一致する場合、これらの集合は「等しい」と言います。Pythonでは、等号(==)を使って集合が等しいかどうかを判定することができます。

# 2つの集合を作成する
S3 = {1, 2, 3}
S4 = {3, 2, 1}

# S3 と S4 が等しいかどうか判定する
are_equal = S3 == S4  # 順番が異なっていても、全ての要素が一致すれば True
print(are_equal)  # True

真部分集合の判定

集合A が集合 B に含まれており、かつ集合A と集合B が等しくない場合、集合A は集合B の「真部分集合」と言います。Pythonでは、小なり(<)を使って真部分集合かどうかを判定することができます。

# S1 が S2 の真部分集合かどうか判定する
is_proper_subset = S1 < S2  # 小なりを使う方法
print(is_proper_subset)  # True

互いに素な集合の判定

2つの集合に共通する要素が全くない場合、これらの集合は「互いに素」と言います。Pythonでは、isdisjoint() メソッドを使って、2つの集合が互いに素であるかどうかを判定することができます。

# 2つの集合を作成する
S5 = {1, 2, 3}
S6 = {4, 5, 6}

# S5 と S6 が互いに素かどうか判定する
are_disjoint = S5.isdisjoint(S6)
print(are_disjoint)  # True

isdisjoint() メソッドについて

isdisjoint() メソッドは、指定した集合に共通する要素がない場合に True を返します。これにより、集合同士が全く重ならないかどうかを確認することができます。

このように、集合同士の関係を確認することで、データ間の包含関係や相互関係を効果的に把握することができます。

要素の存在確認

集合に対して、特定の要素が存在するかどうかを確認することも可能です。Pythonでは、in演算子を使って、集合の中に指定した要素が含まれているかどうかを調べることができます。

要素の存在確認

in演算子は、ある要素集合に含まれているかどうかを確認するために使います。存在する場合は True を返し、存在しない場合は False を返します。

# 集合を作成する
S = {1, 2, 3, 4, 5}

# 要素が集合に含まれているか確認する
print(3 in S)  # True が返ってきます
print(6 in S)  # False が返ってきます

このように、in演算子を使うことで、集合の中に特定の要素が含まれているかどうかを簡単に確認することができます。これは、条件に応じてデータを処理する際に非常に便利な方法です。例えば、特定のデータがリストに存在しているかをチェックする際などに使えます。

要素の取得方法

集合に含まれている要素を取り出す方法について説明します。集合には順序がないため、リストのようにインデックスを使って特定の位置の要素を取り出すことはできません。そこで、集合要素を一つずつ取り出すには「for文」を使います。

for文を使った要素の取り出し

for文とは、Pythonで「何度も繰り返し同じことを行う」ためのしくみです。集合に対してfor文を使うと、集合の中の全ての要素を順番に取り出して処理することができます。

for文の基本的な使い方は、次のように書きます:

# 集合を作成する
S = {1, 2, 3, 4, 5}

# for文を使って集合の要素を一つずつ取り出して表示する
for element in S:
    print(element)

説明

  1. for element in S:
    「S」という集合の中にある要素を一つずつ取り出して、それを「element」という名前の変数代入する、という意味です。この文が書かれている間、Python集合の中の全ての要素を順番に「element」に入れます。
  2. print(element)
    「element」に入っている値を画面に表示します。この行は、集合の中の各要素が取り出されるたびに実行されます。

実行結果

1
2
3
4
5

出力される順番は集合の特性上、決まっているわけではなく、毎回異なる場合があります。

集合をリストに変換してインデックスで要素を取得

集合には順序がないため、特定の位置の要素を取得するには集合リストに変換する必要があります。リストに変換することで、リストが持つ「インデックス」を使って特定の位置の要素を取り出すことができるようになります。

# 集合を作成する
S = {10, 20, 30, 40, 50}

# 集合をリストに変換する
list_S = list(S)

# インデックスを使って要素を取得する
print(list_S[0])  # リストの0番目の要素を取得します

list() 関数について

list() 関数は、集合タプルなどのデータ型リストに変換するために使用します。これにより、集合要素に順番が付けられ、インデックスで特定の位置の要素を取り出すことが可能になります。

説明

  1. list(S)
    この部分で集合S をリストに変換しています。リストに変換することで、順序が決まったデータ構造に変更できます。
  2. list_S[0]
    リストには順序があるため、インデックスを使って要素を取得することができます。この例では、リストの最初の要素(0番目の位置)を取得しています。

注意集合リストに変換するときも、集合に順序がないため、どの順番で要素リストに並ぶかは決まっていません。そのため、毎回異なる順番になる可能性があります。

for文リストへの変換を使うことで、集合要素を様々な方法で取得することができます。

まとめ

今回の記事では、Python集合について、その概要から具体的な操作方法まで網羅的に解説しました。まず、集合の基本的な作り方について学び、重複のないデータを扱う特徴や波括弧やset() 関数を使った作成方法を紹介しました。

次に、要素の追加や削除の方法、要素の変更ができないフローズンセットについても取り上げました。また、和集合積集合差集合対象差集合といった集合演算の方法を解説し、それぞれの関係性を確認するためのメソッドについても触れました。

最後に、集合から要素を取り出す方法として、for文の使用やリストに変換してインデックス要素を取得する方法についても説明しました。

これらの知識を組み合わせることで、効率的に集合を活用し、データを整理・管理する際に役立てることができます。

今回は以上とさせて頂きます。最後までお読みいただきありがとうございました。

MQL5システムトレーダーの為のPython講座:第8回「辞書型について」

         →MQL5システムトレーダーの為のPython講座:第10回「演算子について」

タイトルとURLをコピーしました