前回はsetのset theoryに関する基本的なメソッドを見た。
今回はsetのその他のメソッドを。
set:その他のメソッド
Update(更新)
update:和集合(Union)で上書き
updateの付くメソッドを使う事で、求めた2つのUnion のもう片方をUnionのデータで上書き出来る。
setのupdateは以下4つ、update、intersection_update、difference_update、symmetric_difference_updatedate
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> b = {"green", "red", "orange", "white", "green", "orange"}
>>> a
{'red', 'blue', 'yellow'}
>>> b
{'red', 'orange', 'green', 'white'}
# aを、aとbのUnion(和集合)で上書き。
>>> a.update(b)
>>> a
{'red', 'orange', 'green', 'white', 'yellow', 'blue'}
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"]) # aを戻して
>>> a |= b # もう一度今度はoperator(演算子): '|='でupdate()と同じ処理、aをUnionで上書き。
>>> a
{'red', 'orange', 'green', 'white', 'yellow', 'blue'}
updateが実行の都度aが上書かれてしまうので、aを元に戻してoperatorで実行。
これ以降同じ。
intersection_update:積集合(Intersection)で上書き
片方のset(この場合a)を他方のset(この場合b)とのIntersectionのデータで上書きする。
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> b = {"green", "red", "orange", "white", "green", "orange"}
# aを、aとbのintersection(積集合)で上書き。
>>> a.intersection_update(b)
>>> a
{'red'}
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"]) # aを戻して
>>> a &= b # もう一度今度はoperator(演算子): '&='でaをIntersectionで上書き。
>>> a
{'red'}
difference_update:差集合(Difference)で上書き
片方のset(この場合a)を他方のset(この場合b)とのDifferenceのデータで上書きする。
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> b = {"green", "red", "orange", "white", "green", "orange"}
# aを、aとbのDifference(差集合)で上書き。
>>> a.difference_update(b)
>>> a
{'blue', 'yellow'}
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"]) # aを戻して
>>> a -= b # もう一度今度はoperator(演算子): '-='でaをDifferenceで上書き。
>>> a
{'blue', 'yellow'}
symmetric_difference_updatedate:対称差集合(Symmetric Difference Set)で上書き
片方のset(この場合a)を他方のset(この場合b)とのSymmetric Difference Setのデータで上書きする。
>>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> b = {"green", "red", "orange", "white", "green", "orange"}
# aを、aとbのSymmetric difference(対称差集合)で上書き。
>>> a.symmetric_difference_update(b)
>>> a
{'orange', 'green', 'yellow', 'blue', 'white'}
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"]) # aを戻して
>>> a ^= b # もう一度今度はoperator(演算子): '^='でaをSymmetric differenceで上書き。
>>> a
{'orange', 'green', 'yellow', 'blue', 'white'}
要素を足し引き
add: setに要素を追加する
setに要素を追加するのがadd。
>>> a
{'orange', 'green', 'yellow', 'blue', 'white'}
# 'pink'をset a に追加
>>> a.add('pink')
>>> a
{'orange', 'green', 'yellow', 'pink', 'blue', 'white'} # ランダムなので今回は'yellow'と'blue'の間に追加された。
setは位置情報(index)を持たないので、どの位置に追加されるかは運次第。
discard/pop/remove:setから要素を削除する
discard
discard(“指定した要素”)は指定した要素を削除する。
処理後返ってくる(処理が正常に終わる場合returnされる)のはNone。
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> a
{'red', 'blue', 'yellow'}
# discardにはargumenetが必要
>>> a.discard()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: set.discard() takes exactly one argument (0 given)
# 要素に無いものをargumentとしても、エラーも例外処理も出ない。
>>> a.discard(0)
>>> a
{'red', 'blue', 'yellow'}
>>> a.discard('red')
>>> a
{'blue', 'yellow'}
“TypeError: set.discard() takes exactly one argument (0 given)”のエラーから分かる通り、要素を指定する引数(argument)が必要。
指定した要素がset内に無くても処理は正常に終わる。Noneだけが返され、エラーも例外処理も何も返って来ない。
pop
pop()はsetの要素を一つランダムに取り出し、取り出した要素を出力する。
>>> a # addで使ったa
{'orange', 'green', 'yellow', 'pink', 'blue', 'white'}
>>> a.pop()
'orange'
>>> a
{'green', 'yellow', 'pink', 'blue', 'white'}
>>> a.pop()
'green'
>>> a.pop()
'yellow'
>>> a.pop()
'pink'
>>> a.pop()
'blue'
>>> a.pop()
'white' # 上記一連のpopの処理を見ると1つ目を取り出している様だが、実際のところはランダムとの事。
>>> a
set()
# 空になってからのpop()はKeyErrorを返す
>>> a.pop()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'pop from an empty set'
# setのpop()にargument(引数)を付けるとTypeErrorを返す
>>> a.pop('blue')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: set.pop() takes no arguments (1 given)
上記を見ると1番目を取り出している様だが、実際のところはランダム。
setに要素がない(空)だと”KeyError: ‘pop from an empty set'”を返す。
また、”TypeError: set.pop() takes no arguments (1 given)”というエラーが出る事から分かる通り、引数を取らない。位置(index)や’blue’などの指定も受け付けない。
ただランダムに1つ削除するのがpop。
remove
remove(“指定した要素”)はsetの中から指定した要素を削除する。
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> a
{'blue', 'yellow', 'red'}
# removeはargumentが空では機能しない
>>> a.remove()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: remove() takes exactly one argument (0 given)
>>> a.remove('blue')
>>> a
{'yellow', 'red'}
# setに無い要素をremoveするとKeyErrorになる
>>> a.remove('blue')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'blue'
discardと異なり、removeは削除したい要素が無ければKeyErrorを返す。
removeが正常に処理されれば、Noneが返ってくる。
clear:setの要素全てを削除して空のsetにする
>>> a = set(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> a
{'red', 'blue', 'yellow'}
>>> a.clear()
>>> a
set() # clearされて空集合になった
>>> a.clear() #A 空集合をclearしてもエラーを返さない。ただ空集合を返す。
>>>
copy:コピー
コピーしたいset.copy()でそのsetをcopyする。
>>> a
{'red', 'blue', 'yellow'}
>>> e = a.copy()
>>> e
{'red', 'blue', 'yellow'}
frozenset
最後に、説明では見かけるけど、あまり使う機会が無いfrozensetについて。
frozensetはimmutableなsetを返す。
immutableなsetとは、一度作るとデータを追加したり削除したりclearしたりできないsetの事。
例として、aと同じ要素をfrozensetとして”f”に代入。
>>> f = frozenset(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> f
frozenset({'red', 'blue', 'yellow'})
>>> dir(f)
['__and__', '__class__', '__class_getitem__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
frozensetのメソッドを一覧で見ると分かる通り、add、pop、remove、clearの様な直接要素を足し引きするものも、update系も無いのが分かる。
以下はfrozensetのunionの例。
>>> f = frozenset(["red", "blue", "yellow", "red", "yellow", "blue", "blue"])
>>> b = {"green", "red", "orange", "white", "green", "orange"}
>>> g = frozenset(b)
>>> f
frozenset({'blue', 'yellow', 'red'})
>>> g
frozenset({'green', 'white', 'orange', 'red'})
>>> f.union(g)
frozenset({'red', 'white', 'blue', 'green', 'orange', 'yellow'})
frozensetは一度作って、そのまま中身を加工せず使うという理解。

コメント