web-dev-qa-db-ja.com

型エラーUnhashable type:set

以下のコードには、関数U = set(p.enum())にエラーがあります。これは、ハッシュできないタイプのタイプエラーです。実際には、クラスメソッドenumがセットのリストである「L」と関数内のUはセットである必要があります。そのため、問題の解決を手伝ってください。または、セットのリストをセットのセットに変換するにはどうすればよいですか。

class pattern(object):

        def __init__(self,node,sets,cnt):
            self.node=node
            self.sets=sets
            self.cnt=cnt

        def enum(self):
            L=[]
            if self.cnt==1:
                L = self.node
            else:
                for i in self.sets:
                    L=[]
                    for j in self.node:
                        if i!=j:
                            L.append(set([i])|set([j]))

            return L #List of sets              

    V=set([1,2,3,4])
    U=set()
    cnt=1
    for j in V:
        p=pattern(V,(U|set([j])),cnt)
        U=set(p.enum()) #type error Unhashable type:'set'   
        print U
            cnt+=1 
21
user2014111

セットに入れた個々のアイテムは変更できません。それらが変更された場合、有効なハッシュが変更されるため、包含をチェックする機能が機能しなくなるからです。

代わりに、不変オブジェクトをセットに入れる必要があります-例えばfrozensets。

Returnステートメントをenumメソッドから...に変更した場合.

return [frozenset(i) for i in L]

...それで動作するはずです。

27
Amber

セットには不変の型のみを含めることができるため、このエラーが発生します。または、セットは変更可能です。ただし、frozensetタイプがあります。

In [4]: a, b = {1,2,3}, {2,3,4}

In [5]: set([a,b])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-6ca6d80d679c> in <module>()
----> 1 set([a,b])

TypeError: unhashable type: 'set'

In [6]: a, b = frozenset({1,2,3}), frozenset({2,3,4})

In [7]: set([a,b])
Out[7]: {frozenset({1, 2, 3}), frozenset({2, 3, 4})}
6
Kiwi