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