2014-05-10 21 views
12

Der folgende Code hat einen Fehler in der Funktion U = set (p.enum()) was ein Typfehler von nicht hashbaren Typ: 'Set' tatsächlich, wenn Sie sehen können, die Klassenmethode enum bin ' L 'welche Liste von Sätzen und die U in Funktion sollte ein Satz sein, also können Sie mir bitte helfen, das Problem zu lösen, oder Wie kann ich Liste von Sätzen in Sätze von Sätzen umwandeln?Typ Fehler Unabnehmbarer Typ: Set

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 

Antwort

13

Die einzelnen Elemente, die Sie in eine Reihe stellen kann nicht wandelbar sein, denn wenn sie sich verändert, die effektive Hash ändern würde und damit die Möglichkeit für die Aufnahme zu überprüfen, würde zusammenbrechen.

Stattdessen müssen Sie unveränderliche Objekte in eine Menge einfügen - z. frozenset s.

Wenn Sie die return-Anweisung von Ihrem enum Methode ändern ...

return [frozenset(i) for i in L] 

... dann sollte es funktionieren.

4

Dieser Fehler wird ausgelöst, da eine Gruppe nur unveränderliche Typen enthalten kann. Oder Sätze sind veränderbar. Jedoch gibt es die frozenset Art:

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})}