An Embedded Engineer’s Blog

とある組み込みエンジニアの備忘録的なブログです。

Python学習メモ - その7

まえがき

最近、Python を勉強し始めたので、その学習メモです。

今回はセット(Set)についてです。


セット(Set)

セットはタプルやリストと同様、複数のデータをまとめて扱う場合に使用しますが、ユニーク(一意)な値を格納する順序なしのコレクションです。
例えば、複数のデータから重複したデータを除去したい場合や、数学集合に関する計算を行う場合に使用します。


セット定義 & アクセス

セットは複数のデータをカンマ( , )で区切り、前後に中かっこ「{ }」をつけることでセットとして認識されます。
セットには順序が記憶されないため、タプルやリストのようなインデックスによるアクセス(値取得・変更)はできません。

set_values = {1, 2, 3, 4}
print(set_values)

set_values = {1, 2, 3, 2, 4, 1}
print(set_values)

# print(set_values[0])  # 実行エラー
# set_values[2] = 10    # 実行エラー

実行結果

{1, 2, 3, 4}
{1, 2, 3, 4}


複数型

一意の値であれば、異なる型のデータを格納することもできます。

set_values = {1, 3.14, "set"}
print(set_values)

set_values = {1, 3.14, 1, "set", 3.14}
print(set_values)

実行結果

{1, 3.14, 'set'}
{1, 3.14, 'set'}


空セット

空のセットを定義する場合は、set()関数を使用します。

set_values = set()

print(set_values)

実行結果

set()


値の追加

値の追加はaddメソッドを使用します。

set_values = set()
set_values.add(1)
set_values.add(2)
set_values.add(3)
set_values.add(2)
set_values.add(4)
set_values.add(1)

print(set_values)

実行結果

{1, 2, 3, 4}


値の削除

値の削除はremoveメソッドまたはdiscardメソッドを使用します。
removeメソッドは値が見つからなかった場合に、エラーが発生します。
discardメソッドは値が見つからなかった場合でもエラーが発生しません。

set_values = {1, 2, 3, 4, 5}

set_values.remove(3)
# set_values.remove(6) # Key Error

実行結果

{1, 2, 4, 5}


set_values = {1, 2, 3, 4, 5}

set_values.discard(3)
set_values.discard(6)

print(set_values)

実行結果

{1, 2, 4, 5}


値の取り出し

セットから順番に値を取得する場合は、popメソッドを使用します。 セットがからの場合、エラーが発生します。

set_values = {1, 2, 3, 4, 5}
print(set_values.pop())
print(set_values.pop())
print(set_values.pop())
print(set_values.pop())
print(set_values.pop())
# print(set_values.pop())  # Error

実行結果

1
2
3
4
5


クリア

セットをクリアする場合には、clearメソッドを使用します。

set_values = {1, 2, 3, 4, 5}
print(set_values)

set_values.clear()
print(set_values)

実行結果

{1, 2, 3, 4, 5}
set()


全要素数取得

セット全体の要素数を取得したい場合はlen関数を使用します。

set_values = {1, 2, 3, 4, 5}

print(len(set_values))

実行結果

5


存在確認

セット内に特定の要素が存在しているかを確認する場合には、in演算子を使用します。

set_values = {1, 2, 3, 4, 5}

print(2 in set_values)

実行結果

True


逆に、セットの中に特定の値が含まれていないことを確認したい場合は、not in 演算子を使用します。

set_values = {1, 2, 3, 4, 5}

print(6 in set_values)

実行結果

True


コピー

セットの複製を作成したい場合は、copyメソッドを使用します。

set_values1 = {1, 2, 3, 4, 5}
set_values2 = set_values1
set_values3 = set_values1.copy()

print(set_values1)
print(set_values2)
print(set_values3)

print()

set_values1.add(6)
set_values2.add(7)
print(set_values1)
print(set_values2)
print(set_values3)

実行結果

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}

{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5, 6, 7}
{1, 2, 3, 4, 5}


互いに素

2つのセットが互いに素である(set1とset2が共通の要素を持たない)ことを確認する場合は、isdisjointメソッドを使用します。

set1 = {1, 3, 5, 7}
set2 = {2, 4, 6, 8}

print(set1.isdisjoint(set2))

実行結果

True


部分集合

2つのセットが部分集合の関係である(set1のすべての要素がset2に含まれる(set1とset2が同じでも良い))ことを確認する場合は、issubsetメソッドまたは <= 演算子を使用します。

set1 = {1, 3, 5}

set2 = {1, 2, 3, 4, 5}
print(set1.issubset(set2))
print(set1 <= set2)

print()

set2 = {1, 3, 5}
print(set1.issubset(set2))
print(set1 <= set2)

実行結果

True
True

True
True


真部分集合

2つのセットが真部分集合の関係である(set1のすべての要素がset2に含まれる かつ set1とset2は同じではない)ことを確認する場合は、< 演算子を使用します。 これは、set1.issubset(set2) and set1 != set2と等価です。

set1 = {1, 3, 5}

set2 = {1, 2, 3, 4, 5}
print(set1.issubset(set2) and set1 != set2)
print(set1 < set2)

print()

set2 = {1, 3, 5}
print(set1.issubset(set2) and set1 != set2)
print(set1 < set2)

実行結果

True
True

False
False


上位集合

2つのセットが上位集合の関係である(set2のすべての集合がset1に含まれる(set1とset2が同じでも良い))ことを確認する場合は、issupersetメソッドまたは >= 演算子を使用します。

set1 = {1, 2, 3, 4, 5}

set2 = {1, 3, 5}
print(set1.issuperset(set2))
print(set1 >= set2)

print()

set2 = {1, 2, 3, 4, 5}
print(set1.issuperset(set2))
print(set1 >= set2)

実行結果

True
True

True
True


真上位集合

2つのセットが真上位集合の関係である(set2のすべての要素がset1に含まれる かつ set1とset2は同じではない)ことを確認する場合は、> 演算子を使用します。 これは、set1.issuperset(set2) and set1 != set2と等価です。

set1 = {1, 2, 3, 4, 5}

set2 = {1, 3, 5}
print(set1.issuperset(set2) and set1 != set2)
print(set1 > set2)

print()

set2 = {1, 2, 3, 4, 5}
print(set1.issuperset(set2) and set1 != set2)
print(set1 > set2)

実行結果

True
True

False
False


和集合の作成

set1とset2の要素からなる新しい集合(和集合)を作成する場合、unionメソッドまたは | 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.union(set2)
set4 = set1 | set2

print(set3)
print(set4)

実行結果

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}


積集合の作成

set1とset2の共通要素を持つ新しい集合(積集合)を作成する場合、intersectionメソッドまたは & 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.intersection(set2)
set4 = set1 & set2

print(set3)
print(set4)

実行結果

{1, 3}
{1, 3}


差集合の作成

set1に含まれset2に含まれない要素をもつ新しい集合(差集合)を作成する場合、differenceメソッドまたは - 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.difference(set2)
set4 = set1 - set2

print(set3)
print(set4)

実行結果

{2, 4}
{2, 4}


排他集合の作成

set1とset2のいずれか一方にだけ含まれる要素をもつ新しい集合(排他集合)を作成する場合、symmetric_differenceメソッドまたは ^ 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}
set3 = set1.symmetric_difference(set2)
set4 = set1 ^ set2

print(set3)
print(set4)

実行結果

{2, 4, 5}
{2, 4, 5}


和更新

set1にset2の要素を追加し、set1を更新(和更新)する場合には、updateメソッドまたは |= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 |= set2

print(set1)

実行結果

{1, 2, 3, 4, 5}
{1, 2, 3, 4, 5}


積更新

set1とset2に共通する要素を残し、set1を更新(積更新)する場合には、intersection_updateメソッドまたは、 &= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.intersection_update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 &= set2

print(set1)

実行結果

{1, 3}
{1, 3}


差更新

set1からset2に含まれる要素を取り除き、set1を更新(差更新)する場合には、difference_updateメソッドまたは -= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.difference_update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 -= set2

print(set1)

実行結果

{2, 4}
{2, 4}


排他更新

set1とset2のどちらかのみに含まれる要素によって、set1を更新(排他更新)する場合には、symmetric_difference_updateメソッドまたは ^= 演算子を使用します。

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1.symmetric_difference_update(set2)

print(set1)

set1 = {1, 2, 3, 4}
set2 = {1, 3, 5}

set1 ^= set2

print(set1)

実行結果

{2, 4, 5}
{2, 4, 5}


frozenset

frozensetは追加・削除・更新などの操作が不可能(イミュータブル)なセットです。

関数の戻り値として使用する場合など、要素を変更されたくない場合などにfrozensetを使用します。

fset1 = frozenset()
print(fset1)

fset2 = frozenset({1, 2, 3, 4, 5, 3, 2, 4})
print(fset2)

# fset2.add(1) # 実行エラー

実行結果

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


参考文献

Python 公式リファレンス

https://docs.python.org/ja/3.7/index.html

Python-izm

https://www.python-izm.com/

ゲームを作りながら楽しく学べるPythonプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)