Pythonにはset型という集合を表す変数の型が用意されています。リストやタプルは同じ値を重複して追加することができ、追加した際の順序を保持することができました。一方でsetは順序は保持せずユニークな値を持ちます。
Contents
setの初期化と注意点
setの初期化
set型オブジェクトの初期化は、中括弧の中にカンマ区切りで要素を列挙します。
# setの初期化 s = {'A', 'B', 'C'} print(s) # {'C', 'B', 'A'} # 初期化時に重複があっても・・・ s = {'A', 'B', 'C', 'A'} print(s) # {'C', 'B', 'A'}
2番目の例のように、重複した値をセットしても1つとして扱われます。
setの注意点 「TypeError unhashable type」
また、格納する値はハッシュ化可能でなければなりません。これは、setは要素のユニークさを判定する際にハッシュ値を利用するためです。例えばリストはハッシュ化可能ではないためsetに挿入することはできません。TypeError unhashable typeが発生します。
s = {'A', [1, 2, 3]} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list'
ハッシュ化可能なタプルを利用すれば解決します。
s = {'A', (1, 2, 3)} print(s) # {'A', (1, 2, 3)}
リストからset型変数を生成する
組込みのset関数を使用すると、リストからset型変数を生成することができます。
l = ['a', 'b', 'c', 'a'] # listを生成 s = set(l) # set関数を使用 print(s) # {'a', 'b', 'c'}
ユニークな要素のsetになっていることがわかります。
setの繰り返し処理
set型変数はリストなどと同様に繰り返し処理が可能です。
処理
data_set = {'a', 'b', 'c'} for s in data_set: print(s) # 集合の要素が出力される
実行結果はa,b,cが出力されます。
set型変数の更新操作
set型変数の更新ですが、要素の追加にadd、要素の削除にremove、discardを使います。順序は持たないため、listのようにインデックスを指定する方法はありません。
setの要素追加
要素追加はaddメソッドを使います。以下の構文となります。
s = {1, 2, 3} s.add(4) print(s) # {1, 2, 3, 4}
setの要素削除
要素削除はremoveとdiscardの2つが用意されています。removeは存在しないオブジェクトを指定するとKeyErrorが発生します。
一方、discardは存在しないオブジェクトを指定しても何も起こりません。
サンプルで確認してみましょう。
s = {1, 2, 3, 4} s.remove(4) print(s) # {1, 2, 3} s.remove(99) # KeyErrorが発生する s.discard(99) print(s) # {1, 2, 3}
99を削除する際、removeではエラーが発生しますが、discardの場合はエラーが発生していないことが確認できます。
frozenset イミュータブルなset
最後にset型の兄弟であるfrozensetについて紹介します。初期化の後変更させないようなsetを作りたい場合はfrozenset型を使用します。オブジェクト生成時に引数にlistのようなイテラブルなオブジェクトを指定します。
fs = frozenset(['a', 'b', 'c'])
変更不可という点を除き、ほとんどの操作はsetとおなじであるため、細かい説明は割愛します。