类型错误:不可哈希类型:集合。

57
下面的代码在函数U=set(p.enum())中出现了错误,类型错误为:'set'是不可哈希类型。实际上,如果您能看到类方法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 
2个回答

70
将放入集合中的各个项目设为不可变,因为如果它们发生改变,哈希值也会改变,这样就无法正确检查是否包含在集合中。
相反,您需要将不可变对象放入集合中,例如frozensets。
如果您将enum方法的返回语句改为...
return [frozenset(i) for i in L]

...然后它应该可以工作。

24

此错误是由于集合只能包含不可变类型而引起的。或者说,集合是可变的。但是有一个名为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})}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接