2016-04-14 12 views
2

だから私は経験のカップルを作る:なぜPythonで違いを設定できないのですか?

>>>{2,3} - {2} 
{3} 

この1つは完璧に動作します。

しかし、これは動作しないようです。私はそれが動作する必要があることを考える

>>> {{2,3},{4,3}} - {{4,3}} 
Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'set' 

を私は1つのセットを使用するため、2つの要素を含む、{2,3}および{4,3}マイナス1要素{4,3}になります。

それでも、うまく動作しません。どうして?

答えて

6

setはハッシュ可能ではありません。セットのメンバーになることはできません。代わりにfrozensetを使用してください:

>>> {frozenset({2,3}), frozenset({4,3})} - {frozenset({4,3})} 
set([frozenset([2, 3])]) 

set/frozenset documentationによると:

集合の要素がハッシュ可能でなければなりません。セットの集合を表現するためには、 の内側の集合は、あらかじめ設定されたオブジェクトでなければなりません。 iterableが指定されていない場合は、新しい空のセット が返されます。


hashable

オブジェクトは、その寿命の間 を変化しないハッシュ値を持つ場合(それは__hash__()方法を必要とする)ハッシュ可能であり、他のオブジェクト(と比較 することができます__eq__()メソッドが必要です)。 Hashable 等しいを比較するオブジェクトは、同じハッシュ値を持つ必要があります。

解読可能性は、これらのデータ構造が内部的にハッシュ値を使用するため、オブジェクトを辞書キーとして使用可能にし、セット メンバーを使用可能にします。

Pythonの変更不可能なビルトインオブジェクトはすべてハッシュ可能ですが、変更可能なコンテナ(リストや辞書など)はありません。 のオブジェクトは、ユーザー定義のクラスのインスタンスです。デフォルトでハッシュ可能です。彼らは すべてが(自分自身を除いて)等しくない比較し、そのハッシュ値はid()から派生した です。

+1

正解です。セットや辞書の仕組みについて考えてみましょう。キーをハッシュし、そのハッシュされたキーがセットに含まれているかどうかを調べる必要があります。キーが変更可能な場合、キーのハッシュはセットに追加された後に変更される可能性があります。したがって、文字通りセットをフリーズするだけでセットが不変になり、追加されたキーが変更されても心配する必要はありません。 – gnicholas

+0

アンダートラッピングが正しいことを確認したい。したがって、setはハッシュ可能ではないため、setの要素の1つにすることはできません。 –

+0

@マーズリー、そうです。 – falsetru

関連する問題