1. ホーム
  2. パイソン

[解決済み】セットへのリスト追加?

2022-03-26 04:07:42

質問

Python 2.6 インタプリタでテストしています。

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    a.add(l)
TypeError: list objects are unhashable

Pythonが同じリストを2回追加したかどうかを判断する方法がないので、リストをセットに追加することができないのだと思います。回避策はあるのでしょうか?

EDIT: 要素ではなく、リストそのものを追加したいのですが。

解決方法は?

リストはmutableであるため、セットに追加した後にリストの内容を変更することができるからです。

しかし、タプルの内容を変更することはできないので、タプルをセットに追加することは可能です。

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])


編集 : 少し説明します。ドキュメントでは set として 異なるハッシュ化可能なオブジェクトの非順序型コレクション。 オブジェクトは、要素の検索、追加、削除を、これらの操作を行うたびに個々の要素を調べるよりも高速に行えるよう、ハッシュ化可能でなければならない。具体的にどのようなアルゴリズムが使われているかは ウィキペディアの記事 . Pythonのハッシュアルゴリズムは、以下のサイトで説明されています。 effbot.org とpythons __hash__ 関数で python リファレンス .

いくつかの事実

  • セット要素 と同様に 辞書キー ハッシュ化可能でなければならない
  • ハッシュ化できないデータ型もある。
    • list を使用します。 tuple 代わりに
    • set 使用 frozenset 代わりに
    • dict : には正式な対応表はありませんが、いくつかの レシピ
  • オブジェクトのインスタンスは、デフォルトでハッシュ化可能で、各インスタンスは一意のハッシュを持ちます。Pythonのリファレンスで説明されているように、この動作をオーバーライドすることができます。