Python: setについての備忘録2

Python

前回は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は一度作って、そのまま中身を加工せず使うという理解。

コメント

タイトルとURLをコピーしました