7

興味深いものに出くわしたので、質問してみようと思いました。

に辞書を追加するsetと、辞書が完全な辞書として追加されると想定していましたが、そうではありません。キーのみが追加されます。

dicty = {"Key1": "Val1", "Key2": "Val2"}
setunion = set()
setunion.union(dicty)
=> set(['Key2', 'Key1'])

を使用して追加しようとするとset.add()、エラーが発生します。

setadd = set()
setadd.add(dicty)
Traceback (most recent call last):
  File "python", line 1, in <module>
TypeError: unhashable type: 'dict'

明らかに、この動作はリストとは大きく異なります。

   listy = []
   listy.append(dicty)
   listy
=> [{'Key2': 'Val2', 'Key1': 'Val1'}]

ドキュメントでは、セットはハッシュ可能なオブジェクトの順序付けられていないコレクションであると述べられています。これは、上記の問題のいくつかへのヒントです。

質問

何が起きてる?セット項目はハッシュ可能である必要があるため、明らかに、キーを でセットに追加するだけである理由に関係しています.union()が、なぜ ? でエラーが発生するの.add()ですか?

リストからのセットの動作の違いの背後にある使いやすさの理由はありますか?

基本的にリストのように機能するが、一意のアイテムのみを保持するデータ型が Python (またはライブラリ) にありますか?

4

2 に答える 2

5

を使用して、オブジェクト自体ではなく、セットに追加するメソッドへの引数の要素set.union()を要求します。辞書を反復処理すると、キーが得られます。リスト、タプル、または文字列で使用すると、同様の結果が得られます。これらの内容はセットに追加されます。set.union()

>>> s = {42}
>>> s.union('foo')
set([42, 'o', 'f'])

string ではなく、 1 文字の文字列'o'および'f'が追加されました'foo'

辞書は可変であるため、セットに追加することはできません。セットはハッシュ可能なオブジェクトの格納のみをサポートし、オブジェクトがハッシュ可能であるために必要な要件の 1 つは、オブジェクトが不変であることです。

于 2015-12-04T21:51:17.030 に答える