はじめに
最近参加できていなかったABC291のC問題を解いていたときに,要素の検索が高速で行えるset型に配列データを追加したいタイミングがありました.
しかしPythonではlist型の配列をset型に追加することはできません.
これまでにも同様のことで何度か悩んだことがあったので,ここでまとめておきたいと思います.
結論
さっそく結論から述べると,list型ではなくtuple型にすることで追加することが可能となります.
a = set()
a.add((1, 2))
print(a)
出力は以下のようになり,うまく追加できていることがわかります.
{(1, 2)}
もちろん2次元以上の配列も同様に追加できます
a = set()
a.add((1, 2, 3, 4))
print(a) # {(1, 2, 3, 4)}
複数の配列を追加することも可能です.
a = set()
a.add((1, 2))
a.add((3, 4))
print(a) # {(1, 2), (3, 4)}
ちなみにlist型で追加しようとすると...
a = set()
a.add([1, 2])
print(a)
このようなエラーが出てきます.
TypeError Traceback (most recent call last)
1 a = set()
----> 2 a.add([1, 2])
3 print(a)
TypeError: unhashable type: 'list'
最後に
今回は何度か悩まされたset型への配列の追加の問題に対処する方法についてまとめてみました.
list型は追加不可でtuple型は追加可能なのは,list型はミュータブルであるため,list型のデータが書き換えられた場合にset型のハッシュ値を振り直す必要があるので,イミュータブルなtuple型しか受けつけないのかなと個人的には腑に落ちました.
list型は追加不可でtuple型は追加可能なのは,tuple型はハッシュ可能でありlist型はハッシュ不可能であることからきているそうです.
(@shiracamus 様にコメントにてご指摘いただきました.
ありがとうございます.)
データ構造にそこまで詳しくないので,誤りがあればコメントにてご指摘いただけると幸いです.