まえがき
最近、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
ゲームを作りながら楽しく学べるPythonプログラミング

ゲームを作りながら楽しく学べるPythonプログラミング (Future Coders(NextPublishing))
- 作者: 田中賢一郎
- 出版社/メーカー: インプレスR&D
- 発売日: 2017/03/24
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
エキスパートPythonプログラミング

エキスパートPythonプログラミング 改訂2版 (アスキードワンゴ)
- 作者: Michal Jaworski,TarekZiade,稲田直哉,芝田将,渋川よしき,清水川貴之,森本哲也
- 出版社/メーカー: ドワンゴ
- 発売日: 2018/02/26
- メディア: Kindle版
- この商品を含むブログを見る