3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonでset型に配列を追加したい場合の対処法

Last updated at Posted at 2023-04-25

はじめに

最近参加できていなかった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 様にコメントにてご指摘いただきました.
ありがとうございます.)

データ構造にそこまで詳しくないので,誤りがあればコメントにてご指摘いただけると幸いです.

3
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?