2014-05-10 6 views
12

아래 코드는 unhashable 타입의 타입 에러 인 class U set (p.enum()) 함수에서 에러가 있습니다 : 클래스 메소드를 볼 수 있다면 실제로 'set' L '은 집합 목록이고 함수의 U는 집합이어야하므로 문제를 해결하는 데 도움을 주시겠습니까? 또는 집합 목록 집합을 집합 집합으로 변환 할 수 있습니까? 그들이 변경 한 경우, 유효 해시 따라서 분해 것이 포함을 확인 할 수있는 기능을 변경 때문에 당신이 세트에 넣어타입 에러 Unhashable 타입 : 세트

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 

답변

13

개별 항목은 변경할 수 없습니다.

대신 불변의 개체를 집합에 넣어야합니다. frozenset s. 당신이 당신의 enum 방법에서 return 문을 변경하는 경우

...

return [frozenset(i) for i in L] 

를 ... 그것은 작동합니다.

4

이 오류는 세트에 변경 불가능한 유형만 포함될 수 있기 때문에 발생합니다. 또는 세트가 변경 가능합니다. 그러나 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})} 
관련 문제