このチュートリアルでは、 Python セットの基本と、Python セットを変更するために使用できるさまざまな set メソッドについて学習します。
セットは、Python の組み込みデータ構造の 1 つです。反復しない要素のコレクションを操作する必要がある場合は、そのセットを頼りになるデータ構造として使用します。
次のいくつかのセクションで、Python セットの基本と、それらを操作するために使用できる set メソッドについて説明します。次に、Python で一般的な集合演算を実行する方法を学びます。
さぁ、始めよう!
Python セットの基本
Python では、セットとは、順序付けされていない、反復しない要素のコレクションです。これは、セット内の要素はすべて個別である必要があることを意味します。
セットに要素を追加したり、セットから要素を削除したりできます。したがって、セットは可変コレクションです。さまざまなデータ型の要素を含めることができます。ただし、セット内の個々の要素はハッシュ可能である必要があります。
Python では、オブジェクトのハッシュ値が決して変わらない場合、そのオブジェクトはハッシュ可能であると言われます。 Python 文字列、タプル、辞書などの不変オブジェクトのほとんどはハッシュ可能です。
セットの作成について詳しく学びます。ここでは、次の 2 つのセットを考えてみましょう。
py_set = {0,1,2,(2,3,4),'Cool!'}
py_set = {0,1,2,[2,3,4],'Oops!'}
# Output
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-40-2d3716c7fe01> in <module>()
----> 1 py_set = {0,1,2,[2,3,4],'Oops!'}
TypeError: unhashable type: 'list'
最初のセットには、3 つの数値、タプル、および文字列が含まれています。セットの初期化はエラーなしで実行されます。一方、2 番目のセットにはタプルの代わりにリストが含まれています。リストは変更可能なコレクションであり、ハッシュ化できず、初期化ではTypeError
がスローされます。
📑 これらをすべてまとめると、Python セットを個別のハッシュ可能な要素の変更可能なコレクションとして定義できます。
Python セットの作成方法
まず、Python でセットを作成する方法を学びます。
#1.明示的な初期化の使用
Python でセットを作成するには、セットの要素をコンマ ( ,
) で区切って中括弧{}
で囲んで指定します。
py_set1 = {'Python','C','C++','JavaScript'}
type(py_set1)
# Output
set
以前に Python リストを使用したことがある場合は、 []
空のリストを初期化することをご存知でしょう。 Python セットが中括弧{}
のペアで囲まれている場合でも、セットの初期化に{}
のペアを使用することはできません。これは、 {} it
Python セットではなく Python 辞書を初期化するためです。
py_set2 = {}
type(py_set2)
# Output
dict
再度type()
関数を呼び出して、 py_set
が辞書 ( dict
) であることを確認できます。
#2. set() 関数の使用
空のセットを初期化してそれに要素を追加したい場合は、 set()
関数を使用して行うことができます。
py_set3 = set()
type(py_set3)
# Output
set
#3.他の反復可能オブジェクトをセットにキャストする
セットを作成するもう 1 つの方法は、 set(iterable)
を使用して、リストやタプルなどの他の反復可能オブジェクトをセットにキャストすることです。
py_list = ['Python','C','C++','JavaScript','C']
py_set4 = set(py_list)
print(py_set4)
# {'C++', 'C', 'JavaScript', 'Python'} # repeating element 'C' removed
type(py_set4)
# set
上記の例では、py_list に「C」が 2 回含まれています。ただし、py_set4 では、セットは個別の要素のコレクションであるため、「C」は 1 回だけ表示されます。セットにキャストするこの手法は、Python リストから重複を削除するためによく使用されます。
Python セットに要素を追加する方法
まず空のセットpy_set
を作成し、このチュートリアルの残りの部分でそれを使用してみましょう。
py_set = set()
len(py_set) # returns the length of a set
# Output
0
#1. .add() メソッドの使用
要素をセットに追加するには、
.add()
メソッドを使用できます。set.add(element)
要素をセットに追加します。
わかりやすくするために、Python セットに要素を追加し、各ステップでセットを出力します。
▶️ 文字列「Python」を要素としてpy_set
に追加しましょう。
py_set.add('Python')
print(py_set)
# Output
{'Python'}
次に、別の要素を追加します。
py_set.add('C++')
print(py_set)
# Output
{'Python', 'C++'}
.add()
メソッドは、要素がまだ存在しない場合にのみ要素をセットに追加することを理解することが重要です。追加したい要素がセットにすでに含まれている場合、追加操作は効果がありません。
これを確認するために、 py_set
に「C++」を追加してみましょう。
py_set.add('C++')
print(py_set)
# Output
{'Python', 'C++'}
セットには「C++」が含まれているため、追加操作は効果がありません。
▶️ セットにさらにいくつかの要素を追加しましょう。
py_set.add('C')
print(py_set)
py_set.add('JavaScript')
print(py_set)
py_set.add('Rust')
print(py_set)
# Output
{'Python', 'C++', 'C'}
{'JavaScript', 'Python', 'C++', 'C'}
{'Rust', 'JavaScript', 'Python', 'C++', 'C'}
#2. .update() メソッドの使用
これまで、既存のセットに要素を一度に 1 つずつ追加する方法を見てきました。
一連の要素に複数の要素を追加したい場合はどうすればよいでしょうか?
これを行うには、
set.update(collection)
.update()
() メソッドを使用し、collection
内の要素をセットに追加します。collection
は、リスト、タプル、辞書などを指定できます。
py_set.update(['Julia','Ruby','Scala','Java'])
print(py_set)
# Output
{'C', 'C++', 'Java', 'JavaScript', 'Julia', 'Python', 'Ruby', 'Rust', 'Scala'}
このメソッドは、メモリ内に別のオブジェクトを作成せずに要素のコレクションをセットに追加する場合に役立ちます。
次のセクションでは、セットから要素を削除する方法を学びましょう。
Python セットから要素を削除する
次のセット (更新操作前のpy_set
) を考えてみましょう。
py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}
#1. .pop() メソッドの使用
set.pop()
セットから要素をランダムに削除し、それを返します。 py_set
で Pop メソッドを呼び出して、何が返されるかを見てみましょう。
py_set.pop()
# Output
'Rust'
今回は、 .pop()
メソッドの呼び出しにより文字列「Rust」が返されました。
注: .pop()
メソッドは要素をランダムに返すため、最後にコードを実行すると、別の要素を取得することになります。
セットを調べると、「Rust」はセット内に存在しなくなりました。
print(py_set)
# Output
{'JavaScript', 'Python', 'C++', 'C'}
#2. .remove() メソッドと Discard() メソッドの使用
実際には、セットから特定の要素を削除したい場合があります。これを行うには、 .remove()
メソッドと.discard()
メソッドを使用できます。
set.remove(element)
セットから要素を削除します。
py_set.remove('C')
print(py_set)
# Output
{'JavaScript', 'Python', 'C++'}
セットに存在しない要素を削除しようとすると、KeyError が発生します。
py_set.remove('Scala')
# Output
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-58-a1abab3a8892> in <module>()
----> 1 py_set.remove('Scala')
KeyError: 'Scala'
もう一度py_set
を見てみましょう。これで 3 つの要素ができました。
print(py_set)
# Output
{'JavaScript', 'Python', 'C++'}
構文set.discard(element)
を使用すると、 .discard()
メソッドはセットから要素も削除します。
py_set.discard('C++')
print(py_set)
# Output
{'JavaScript', 'Python'}
ただし、存在しない要素を削除しようとしてもKeyError
発生させないという点で.remove()
メソッドとは異なります。
.discard()
メソッドを使用してリストから「Scala」(存在しない) を削除しようとしても、エラーは表示されません。
py_set.discard('Scala') #no error!
print(py_set)
# Output
{'JavaScript', 'Python'}
Python セットの要素にアクセスする
これまで、Python セットに要素を追加および削除する方法を学習しました。ただし、セット内の個々の要素にアクセスする方法はまだ見ていません。
セットは順序付けされていないコレクションであるため、インデックス付けできません。したがって、インデックスを使用してセットの要素にアクセスしようとすると、次のようなエラーが発生します。
py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}
print(py_set[0])
# Output
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-27-0329274f4580> in <module>()
----> 1 print(py_set[0])
TypeError: 'set' object is not subscriptable
では、セット内の要素にどのようにアクセスするのでしょうか?
これを行うには、次の 2 つの一般的な方法があります。
- セットをループして各要素にアクセスする
- 特定の要素がセットのメンバーであるかどうかを確認する
▶️ for
ループを使用してセットをループし、要素にアクセスします。
for elt in py_set:
print(elt)
# Output
C++
JavaScript
Python
Rust
C
実際には、 in
演算子を使用して、指定された要素がセット内に存在するかどうかを確認したい場合があります。
注:セット
in
要素がセット内に存在する場合、セット内の要素はTrue
を返します。それ以外の場合はFalse
を返します。
この例では、 py_set
は「C++」が含まれていますが、「Julia」は含まれておらず、 in
演算子はそれぞれTrue
とFalse
を返します。
'C++' in py_set
# True
'Julia' in py_set
# False
Python セットの長さを求める
前に見たように、 len()
関数を使用して、セット内に存在する要素の数を取得できます。
py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}
len(py_set)
# Output: 5
Python セットをクリアする方法
すべての要素を削除してセットをクリアするには、 .clear()
メソッドを使用できます。
py_set
で.clear()
メソッドを呼び出してみましょう。
py_set.clear()
これを出力しようとすると、セットが空であることを示すset()
が返されます。 len()
関数を呼び出して、セットの長さがゼロであることを確認することもできます。
print(py_set)
# set()
print(len(py_set))
# 0
これまで、Python セットに対して基本的なCRUD操作を実行する方法を学習しました。
- 作成:
set()
関数の使用、型キャスト、および初期化 - 読み取り: メンバーシップ テスト用のループと
in
演算子を使用してセットの要素にアクセスします - 更新: セットの要素を追加、削除し、セットを更新します。
- 削除: セットからすべての要素を削除してセットをクリアします。
Python コードで説明する一般的な集合演算
Python セットを使用すると、基本的なセット演算を実行することもできます。このセクションではそれらについて学びます。
#1.集合の和集合
集合論では、2 つの集合の和集合は、2 つの集合のうちの少なくとも 1 つのすべての要素の集合です。 A と B の 2 つのセットがある場合、共用体には A のみに存在する要素、B のみに存在する要素、および A と B の両方に存在する要素が含まれます。
集合の和集合を見つけるには、 |
使用できます。演算子または.union()
構文のメソッド: setA.union(setB)
。
setA = {1,3,5,7,9}
setB = {2,4,6,8,9}
print(setA | setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}
setA.union(setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}
Set Union は可換演算です。したがって、AUB は BU A と同じです.union()
メソッド呼び出しでsetA
とsetB
の位置を交換して、これを確認してみましょう。
setB.union(setA)
# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}
#2.集合の交差
もう 1 つの結合セット演算は、2 つのセット A と B の交差です。セット交差演算は、A と B の両方に存在するすべての要素を含むセットを返します。
以下のコード スニペットで説明されているように、交差を計算するには、 &
演算子または.intersection()
メソッドを使用できます。
print(setA & setB)
# Output
{9}
setA.intersection(setB)
# Output
{9}
この例では、要素 9 が setA と setB の両方に存在します。したがって、交差セットにはこの要素のみが含まれます。
集合和集合と同様に、集合積集合も可換演算です。
setB.intersection(setA)
# Output
{9}
#3.セット差
任意の 2 つのセットが与えられた場合、和集合と交差は、それぞれ両方のセットと少なくとも 1 つのセットに存在する要素を見つけるのに役立ちます。一方、セットの差は、一方のセットには存在するが、もう一方のセットには存在しない要素を見つけるのに役立ちます。
–
setA.difference(setB)
setA
にのみ存在し、setB
には存在しない要素のセットを与えます。–
setB.difference(setA)
setB
にのみ存在し、setA
には存在しない要素のセットを与えます。
print(setA - setB)
print(setB - setA)
# Output
{1, 3, 5, 7}
{8, 2, 4, 6}
明らかに、A\B は B\A と同じではないため、集合の差は交換演算ではありません。
setA.difference(setB)
# {1, 3, 5, 7}
setB.difference(setA)
# {2, 4, 6, 8}
#4.対称セット差
セットの交差により両方のセットに存在する要素が得られますが、対称セットの差分により、セットの一方にのみ存在する要素のセットが返されます。
次の例を考えてみましょう。
setA = {1,3,5,7,10,12}
setB = {2,4,6,8,10,12}
対称差分セットを計算するには、 ^
演算子または.symmetric_difference()
メソッドを使用できます。
print(setA ^ setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8}
要素 10 と 12 はsetA
とsetB
の両方に存在します。したがって、それらは対称差分セットには存在しません。
setA.symmetric_difference(setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8}
対称セット差分演算では、2 つのセットのうちの 1 つに現れるすべての要素が収集されるため、要素が収集される順序に関係なく、結果のセットは同じになります。したがって、対称集合差分は可換演算です。
setB.symmetric_difference(setA)
# Output
{1, 2, 3, 4, 5, 6, 7, 8}
#5.サブセットとスーパーセット
集合論では、サブセットとスーパーセットは 2 つのセット間の関係を理解するのに役立ちます。
2 つのセット A と B が与えられた場合、セット B のすべての要素がセット A にも存在する場合、セット B はセット A のサブセットになります。また、セット A はセット B のスーパーセットです。
languages
とlanguages_extended
という 2 つのセットの例を考えてみましょう。
languages = {'Python', 'JavaScript','C','C++'}
languages_extended = {'Python', 'JavaScript','C','C++','Rust','Go','Scala'}
Python では、 .issubset()
メソッドを使用して、特定のセットが別のセットのサブセットであるかどうかを確認できます。
setA.issubset(setB)
setA
setB
のサブセットの場合にTrue
を返します。それ以外の場合は、False
を返します。
この例では、 languages
languages_extended
のサブセットです。
languages.issubset(languages_extended)
# Output
True
同様に、 .issuperset()
メソッドを使用して、特定のセットが別のセットのスーパーセットであるかどうかを確認できます。
setA.issuperset(setB)
setA
setB
のスーパーセットである場合にTrue
を返します。それ以外の場合は、False
を返します。
languages_extended.issuperset(languages)
# Output
True
languages_extended
言語のスーパーセットであるため、上記のように、 languages_extended.issuperset(languages)
True
を返します。
結論
このチュートリアルが、Python セットの仕組み、CRUD 操作のセット メソッド、および一般的なセット操作を理解するのに役立つことを願っています。次のステップとして、Python プロジェクトでそれらを使用してみることができます。
他の詳細な Python ガイドを確認してください。楽しく学習しましょう!