325

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

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

編集:リストの要素ではなく、リスト自体を追加したい。

4

12 に答える 12

17

機能に注意してくださいset.update()。ドキュメントには次のように記載されています。

セットを自分自身と他のものを結合して更新します。

于 2012-05-05T12:01:53.420 に答える
9

リストオブジェクトはハッシュできません。ただし、それらをタプルに変換することをお勧めします。

于 2009-08-20T14:43:17.900 に答える
7

セットに変更可能な(変更可能な)要素/メンバーを含めることはできません。リストは変更可能であるため、セットのメンバーにすることはできません。

セットは変更可能であるため、セットのセットを持つことはできません。ただし、フリーズセットのセットを持つことができます。

(同じ種類の「可変性要件」がdictのキーに適用されます。)

他の答えはすでにあなたにコードを与えました、私はこれが少し洞察を与えることを望みます。AlexMartelliがさらに詳細に答えてくれることを願っています。

于 2009-08-20T14:47:53.090 に答える
6

今日、似たようなことをする必要があることがわかりました。アルゴリズムは、セットに追加する必要がある新しいリストをいつ作成するかを認識していましたが、リストの操作がいつ終了するかは認識していませんでした。

とにかく、私が望んでいた動作は、idではなくset を使用することhashでした。そのため、私が望んでいた動作を提供するmydict[id(mylist)] = mylist代わりに見つけました。myset.add(mylist)

于 2011-03-23T17:33:48.960 に答える
5

リストではなくタプルを追加したい:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

リストがある場合は、上記のようにタプルに変換できます。タプルは不変であるため、セットに追加できます。

于 2009-08-20T14:47:02.543 に答える
4

ハッシュ可能なタプルを使用することをお勧めします(リストのような可変オブジェクトをハッシュすることはできません)。

>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])
于 2009-08-20T14:45:08.100 に答える
4

*以下のように unpackを使用してみてください。

>>> a=set('abcde')
>>> a
{'a', 'd', 'e', 'b', 'c'}
>>> l=['f','g']
>>> l
['f', 'g']
>>> {*l, *a}
{'a', 'd', 'e', 'f', 'b', 'g', 'c'}
>>> 

編集者以外のバージョン:

a=set('abcde')
l=['f', 'g']
print({*l, *a})

出力:

{'a', 'd', 'e', 'f', 'b', 'g', 'c'}
于 2020-12-23T09:20:17.520 に答える