2016-12-26 14 views
0

Pythonの中で私が実際に私を驚かせるのは、このエラーです:TypeError: unhashable type。理想的にはセットに基づくオブジェクトを属性として比較する| TypeError:Unhashable type

私はこのように集合演算子を使用することができますので、私はだけではなく、リストのセットを使用したデータ構造を持ちたい:私も私ので、セットが含まれているセットを作成することはできません

a = {({1,2}, 'alpha'), ({2,3}, 'beta')} 
b = {({1,2}, 'alpha')} 

c = a - b # c = {({2,3}, 'beta')} 

TypeError: unhashable type: set

私はリストの代わりにセットを使用しようとします。この方法では、少なくともaとbの値を割り当てることができます。しかし、同じエラーに別のリードから1セットを減算する再びsetメソッドを使用して:

a = [({1,2}, 'alpha'), ({2,3}, 'beta')] 
b = [({1,2}, 'alpha')] 

c = list(set(a) - set(b)) # c = [({2,3}, 'beta')] 

私は辞書代わりのリスト、同じエラーでそれを試してみました。

質問:質問:どのようにセットを含む要素を含む2つの束​​を比較できますか?

私は根本的に間違っていると思っていますか、 "pythonicではない"とエラーはデータ構造そのものに根付いていますか?

ありがとうございました!そのことのために正確に作成され

マフは

+0

申し訳ありませんが、タイプミスでした。 – Raggamuffin

+0

@Slamが提案したように、 '{1,2}'を 'frozenset([1,2]) 'に置き換えるとうまくいきます。 –

答えて

3

あなたがすることができる唯一のことは、内部データのfrozensetを使用する(または、それは外の世界から来た場合frozenset型にセットを変換)することです。

標準ライブラリの変更可能なデータ構造はハッシュすることはできません(おそらくほとんどの場合は実装しないでください)。単純な理由があります。

+1

'変更可能なデータ構造がハッシュされることはありません'は真ではありません。どんなクラスでも '__hash __(self)'を実装することができます。 –

+0

さて、良い点。 – Slam

2

(または辞書のキーとして)不変(または少なくともhashable)のデータしか置くことはできません。set/listでハッシュを実装する方法を考えると、速くなるでしょう。 set自体は変更できません。 frozensetです。

同様の質問はここにある:Why aren't Python sets hashable?

a = {(frozenset((1, 2)), 'alpha'), (frozenset((2, 3)), 'beta')} 
b = {(frozenset((1, 2)), 'alpha')} 

c = a - b 
print(c) # -> {(frozenset({2, 3}), 'beta')} 

これは、今あなたがしたいだけで何ありません。

関連する問題