Pythonでは、セットは順序付けされていない項目を格納するデータ構造です。また、セットのアイテムはインデックスを持ちません。リストと同様に、セットでは要素の追加と削除が可能です。しかし、セットを定義し、他のデータ構造から分離するいくつかのユニークな特性があります。
- セットには重複する項目はない。
- セットの要素は不変であり、変更することはできないが、セット自体は変更可能である。
- セットにはインデックスがないので、セットはスライスやインデックス操作をサポートしない。
このガイドでは、Pythonでセットを作成し使用する方法と、セットに対して実行する一般的な操作について見ていきます。
このガイドでは、Pythonで集合を作成し使用する方法と、集合に対して実行する一般的な操作を紹介します。
>
Pythonで集合を作成する方法
集合は任意の数の項目を保持することができ、項目は整数、文字列、タプルなどの異なる型(異種集合)であることができる。
注意:集合はリストや辞書のような変更可能な要素を受け入れない.
中括弧 {}
内にすべてのセット要素を渡し、カンマ (,
) で要素を区切ることでセットを作成することができます。
num_set = {1, 2, 3, 4, 5, 6}
print(num_set)
これは次のような結果になります。
{1, 2, 3, 4, 5, 6}
今、数字の集合を作りました。文字列の集合を作ることもできます。
string_set = {"Nicholas", "Michelle", "John", "Mercy"}
print(string_set)
その結果
{'Michelle', 'Nicholas', 'John', 'Mercy'}
注:出力の要素が、セットに追加した方法と同じ方法で順序付けされていないことに注意してください。この理由は、セットの項目は順序付けされていないためです。同じコードをもう一度実行すると、要素が異なる順序で配置された出力が得られる可能性が高いです。
また、異なるタイプの要素でセットを作成することもできます。
mixed_set = {2.0, "Nicholas", (1, 2, 3)}
print(mixed_set)
これが有効な集合を生成することを検証してみましょう。
{2.0, 'Nicholas', (1, 2, 3)}
上の集合の要素はすべて異なるタイプに属しています。リストからセットを作成することもできます。これは、Pythonの組み込みメソッドである set()
を呼び出すことで実現できます。
num_set = set([1, 2, 3, 4, 5, 6])
print(num_set)
この結果は
{1, 2, 3, 4, 5, 6}
上で述べたように、集合は重複する項目を保持しません。もし私たちのリストに重複する項目があったとしましょう。
num_set = set([1, 2, 3, 1, 2])
print(num_set)
セットには、リストからユニークな値だけが格納されます。
{1, 2, 3}
セットは本質的に重複を除去し、各重複項目の1つだけを返します。これは、ゼロからセットを作成するときにも起こります。
num_set = {1, 2, 3, 1, 2}
print(num_set)
ここでも、セットは重複を取り除き、重複する項目を1つだけ返します。
{1, 2, 3}
空のセットを作りたいときに空の中括弧({}
)を使うと、空のセットではなく、空の辞書を作ることになります。
x = {}
print(type(x)) # <class 'dict'=""
Pythonで空のセットを作るには、何も値を渡さずに set()
メソッドを呼び出します。
x = set()
print(type(x)) # <class 'set'=""
Pythonでセットアイテムにアクセスする方法
Pythonは、添え字を使った個々のセットアイテムにアクセスする方法を提供していません (set[index]
)。しかし、for
ループを使って、セットのすべての項目を繰り返し処理することができます。
months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])
for m in months:
print(m)
これは months
セットの各要素を表示します。
March
Feb
Dec
Jan
May
Nov
Oct
Apr
June
Aug
Sep
July
また、 in
キーワードを使用して、セット内の要素の有無を確認することもできます。
months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])
print("May" in months)
Mayは
monthsセットに含まれているので、これは
True` を返します。
True
同様に、セット内に存在しない要素を検索すると、 False
が返されます。
months = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])
print("Nicholas" in months)
という結果になります。
False
Pythonの集合に項目を追加する方法
Python では、add()
メソッドを使用して新しいアイテムをセットに追加することができます。
months = set(["Jan", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])
months.add("Feb")
print(months)
アイテム Feb
がセットへ正常に追加されます。
{'Oct', 'Dec', 'Feb', 'July', 'May', 'Jan', 'June', 'March', 'Sep', 'Aug', 'Nov', 'Apr'}
もしこれが数字のセットであれば、文字列の場合のように引用符で囲んで新しい要素を渡す必要はありませんでした。
num_set = {1, 2, 3}
num_set.add(4)
print(num_set)
これで num_set
に 4
が追加されます。
{1, 2, 3, 4}
次のセクションでは、セットから要素を削除する方法について説明します。
Pythonのセットから項目を削除する方法
Python では当然、セットからアイテムを削除することができます。しかし、セットの要素にはインデックスがないので、インデックスを介してアイテムを削除することはできません。アイテムを削除するには、その特定の要素を参照しながら discard()
メソッドか remove()
メソッドを使用します。
注意: discard()
メソッドは、そのアイテムがセット内で見つからなかった場合でもエラーを発生させないことに留意してください。しかし、remove()
メソッドを使用してアイテムが見つからなかった場合は、エラーが発生します。
####破棄()
ここでは、discard()
メソッドを使って要素を削除する方法を説明します。
num_set = {1, 2, 3, 4, 5, 6}
num_set.discard(3)
print(num_set)
要素 3
はセットから取り除かれます。
{1, 2, 4, 5, 6}
remove()
同様に、remove()
メソッドも以下のように使用することができます。
num_set = {1, 2, 3, 4, 5, 6}
num_set.remove(3)
print(num_set)
これは同じ結果をもたらします。
{1, 2, 4, 5, 6}
存在しない要素を削除する?
では、集合の中に存在しない要素を削除してみましょう。まず、discard()
メソッドを使ってみましょう。
num_set = {1, 2, 3, 4, 5, 6}
num_set.discard(7)
print(num_set)
上のコードを実行しても、セットには何の影響もありません。
{1, 2, 3, 4, 5, 6}
次に、同じシナリオで remove()
メソッドを使うとどうなるかを見てみましょう。
num_set = {1, 2, 3, 4, 5, 6}
num_set.remove(7)
print(num_set)
この場合、存在しない要素を削除しようとすると、エラーが発生します。
Traceback (most recent call last):
File "C:Usersdminsets.py", line 2, in <module
num_set.remove(7)
KeyError: 7
♪♪~ ポップ()
pop()` メソッドを使うと、要素を削除して返すことができます。要素は順番に並べられないので、削除される項目はわかりませんし、予測もできません。
num_set = {1, 2, 3, 4, 5, 6}
print(num_set.pop())
これは、セットから削除された要素を返します。
1
同じ方法で、ある要素を削除して、集合に残っている要素を返すことができます。
num_set = {1, 2, 3, 4, 5, 6}
num_set.pop()
print(num_set)
これは、集合に残っている要素を出力します。
{2, 3, 4, 5, 6}
クリア()
Python の clear()
メソッドは、セットからすべての要素を削除するのに役立ちます。
num_set = {1, 2, 3, 4, 5, 6}
num_set.clear()
print(num_set)
出力は空の set()
で、その中には要素はありません。
set()
Python集合のユニオン
A と B という 2 つの集合があるとします。2 つの集合の和は、両方の集合の要素をすべて含む集合です。このような操作は、Pythonの union()
メソッドで実現できます。
例えば、月の名前を含む2つの集合があるとします。
months_a = set(["Jan", "Feb", "March", "Apr", "May", "June"])
months_b = set(["July", "Aug", "Sep", "Oct", "Nov", "Dec"])
all_months = months_a.union(months_b)
print(all_months)
このコードを実行すると、 all_months
セットには months_a
と months_b
のセットの和が含まれることになります。
{'Oct', 'Jan', 'Nov', 'May', 'Aug', 'Feb', 'Sep', 'March', 'Apr', 'Dec', 'June', 'July'}
2 つ以上のセットに対して和集合を実行することもでき、その場合はすべての要素が 1 つのセットに結合されます。
x = {1, 2, 3}
y = {4, 5, 6}
z = {7, 8, 9}
output = x.union(y, z)
print(output)
これは次のような結果になります。
{1, 2, 3, 4, 5, 6, 7, 8, 9}
ユニオン操作の間、重複は無視され、重複している項目のうちの1つだけが表示される。
x = {1, 2, 3}
y = {4, 3, 6}
z = {7, 4, 9}
output = x.union(y, z)
print(output)
この結果、集合は出発集合から一意な値だけを含むようになる。
{1, 2, 3, 4, 6, 7, 9}
演算子 |
は、2つ以上の集合の和を求めるために使うこともできます。
months_a = set(["Jan","Feb", "March", "Apr", "May", "June"])
months_b = set(["July", "Aug", "Sep", "Oct", "Nov", "Dec"])
print(months_a | months_b)
これは unoion()
メソッドを使ったときと同じ結果になります。
{'Feb', 'Apr', 'Sep', 'Dec', 'Nov', 'June', 'May', 'Oct', 'Jan', 'July', 'March', 'Aug'}
2つ以上の集合の和集合を求める場合は、 |
演算子を用いて集合名を区切ります。
x = {1, 2, 3}
y = {4, 3, 6}
z = {7, 4, 9}
print(x | y | z)
これは次のようになります。
{1, 2, 3, 4, 6, 7, 9}
Python集合の交点
A と B という 2 つの集合があるとします。その交点は、A と B の両方に存在する要素を持つ集合となります。
集合における交差演算は、&
演算子か intersection()
メソッドを用いて行うことができます。
x = {1, 2, 3}
y = {4, 3, 6}
print(x & y)
唯一の共通要素は 3
です。
{3}
同じことは intersection()
メソッドでも実現できます。
x = {1, 2, 3}
y = {4, 3, 6}
z = x.intersection(y)
print(z)
これも結果的に
{3}
Pythonセットの違い
A と B の差分 (A – B) は、A に含まれ B に含まれないすべての要素を持つ集合です。したがって、(B – A) は B に含まれ A に含まれないすべての要素を持つ集合となります。
Pythonで集合の差を求めるには、 difference()
メソッドか -
演算子を使用します。
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
diff_set = set_a.difference(set_b)
print(diff_set)
上のコードは set_a
と set_b
の差を計算するので、それらが出力となります。
{1, 2, 3}
マイナス演算子(-
)を使っても、次のように2つの集合の差を求めることができます。
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
print(set_a - set_b)
これは difference()
メソッドを使ったときと同じ出力になります。
{1, 2, 3}
集合Aと集合Bの対称的な差は、AとBにある要素のうち、両方の集合に共通する要素を除いたすべての要素を持つ集合です。これは、Pythonの symmetric_difference()
メソッド、または ^
演算子を用いて決定されます。
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
symm_diff = set_a.symmetric_difference(set_b)
print(symm_diff)
という結果になります。
{1, 2, 3, 6, 7, 8}
前にも述べたように、対称差は ^
演算子を使っても求めることができます。
set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}
print(set_a ^ set_b)
となり、先ほどと同じ出力が得られます。
{1, 2, 3, 6, 7, 8}
Pythonセットの比較
集合を、それらが持つ要素によって比較することができます。この方法では、ある集合が他の集合のスーパーセットなのかサブセットなのかを知ることができます。このような比較の結果は True
または False
のどちらかになります。
集合Aが集合Bの部分集合であるかどうかを調べるには、次のような操作をすればよい。
A <= B
BがAのスーパーセットであるかどうかを調べるには、次の演算を使うことができる。
B >= A
例えば
months_a = set(["Jan", "Feb", "March", "Apr", "May", "June"])
months_b = set(["Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])
subset_check = months_a <= months_b
superset_check = months_b >= months_a
print(subset_check)
print(superset_check)
月_aは月_b
の部分集合であり、月_a`の上位集合である。したがって、上記のコードを実行すると、次のようになります。
True
True
サブセットとスーパーセットは、以下のように issubset()
メソッドと issuperset()
メソッドを使っても確認することができます。
months_a = set(["Jan","Feb", "March", "Apr", "May", "June"])
months_b = set(["Jan","Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"])
subset_check = months_a.issubset(months_b)
superset_check = months_b.issuperset(months_a)
print(subset_check)
print(superset_check)
これは、上の例と同じ出力になります。
True
True
Pythonのセットメソッド
以下のセクションでは、Pythonが提供するセットメソッドのうち、まだ説明していない最も一般的に使用されるものについて説明します。
copy()
このメソッドは、当該セットのコピーを返します。
string_set = {"Nicholas", "Michelle", "John", "Mercy"}
x = string_set.copy()
print(x)
出力は x
がセット string_set
のコピーであることを示しています。
{'John', 'Michelle', 'Nicholas', 'Mercy'}
isdisjoint()
このメソッドは、対象の集合が交点を持つかどうかを調べます。集合に共通項目がない場合、このメソッドは True
を返し、そうでない場合は False
を返します。
names_a = {"Nicholas", "Michelle", "John", "Mercy"}
names_b = {"Jeff", "Bosco", "Teddy", "Milly"}
x = names_a.isdisjoint(names_b)
print(x)
2つのセットには共通の項目がないので、出力は True
となります。
True
len()
このメソッドは集合の長さ(集合に含まれる要素の総数)を返します。
names_a = {"Nicholas", "Michelle", "John", "Mercy"}
print(len(names_a))
出力は集合の長さが4であることを示している。
4
パイソンフローズンセット
フローズンセットは、集合の特徴を持ちながら、一度要素が割り当てられると変更できないクラスです。タプルは不変のリスト、フローズンセットは不変のセットと見なすことができます。
注:セットはmutableでunhashableなので、辞書のキーとして使うことはできない。フローズンセットはハッシュ化可能であり、辞書のキーとして使用することができます。
フローズンセットを作成するには、frozenset()
メソッドを使用します。Xと
Y` という二つのフローズンセットを作ってみよう。
X = frozenset([1, 2, 3, 4, 5, 6])
Y = frozenset([4, 5, 6, 7, 8, 9])
print(X)
print(Y)
この結果、以下のようになります。
frozenset({1, 2, 3, 4, 5, 6})
frozenset({4, 5, 6, 7, 8, 9})
フロジンセットは copy()
, difference()
, symmetric_difference()
, isdisjoint()
, issubset()
, intersection()
, issuperset()
, union()
などの Python セットメソッドが使用可能です。
結論
このガイドでは、Pythonにおける集合の詳細な紹介を行いました。集合の数学的な定義は、Pythonの集合の定義と同じです。セットとは、単純に順不同のアイテムのコレクションです。セット自体は変更可能ですが、セットの要素は不変です。しかし、集合の要素を自由に追加したり削除したりすることができます。多くのデータ構造では、要素にはインデックスが付けられます。しかし、集合の要素には索引がない。このため、特定の集合要素を対象とした操作を行うことができない。
。