2015-12-28 1 views
1

J'utilise Python pour mettre en œuvre un Earley Parser qui a contexte les règles du libre définies comme suit:Comment vérifier si un objet existe dans une liste d'objets?

class Rule: 
    def __init__(self,string,i,j,dot): 
     self.i = 0 
     self.j = 0 
     self.dot = 0 
     string = string.split('->') 
     self.lhs = string[0].strip() 
     self.rhs1 = string[1].strip() 
     self.rhs = [] 
     self.rhs1 = self.rhs1.split(' ') 
     for word in self.rhs1: 
      if word.strip()!= '': 
       self.rhs.append(word) 

    def __eq__(self, other): 
     if self.i == other.i: 
      if self.j == other.j: 
       if self.dot == other.dot: 
        if self.lhs == other.lhs: 
         if self.rhs == other.rhs: 
          return True 
     return False 

Pour vérifier si un objet de classe Rule existe dans un tableau de points ou non, j'ai utilisé les éléments suivants:

def enqueue(self, entry, state): 
    if state in self.chart[entry]: 
     return None 
    else: 
     self.chart[entry].append(state) 

où tableau est un tableau qui est censé contenir des listes d'objets de classe Rule:

def __init__(self, words): 
    self.chart = [[] for i in range(len(words))] 

En outre, je vérifier si une règle existe que dans le chart[entry] comme suit (et si elle n'existe pas, ajoutez simplement):

def enqueue(self, entry, state): 
    if state in self.chart[entry]: 
     return None 
    else: 
     self.chart[entry].append(state) 

Cependant, cela me donne une erreur comme

TypeError: 'in <string>' requires string as left operand, not classobj 

Pour contourner cela, j'ai même déclaré une fonction __eq__ dans la classe elle-même, mais cela ne semble pas fonctionner. Quelqu'un peut-il m'aider avec la même chose?

+0

Êtes-vous sûr à 100% que 'self.chart [entry]' est une liste? À partir du message d'erreur, il semble que 'self.chart [entrée]' est une chaîne. Que se passe-t-il si vous faites 'print type (self.chart [entry])' au début de 'enqueue'? – Kevin

+2

Modifier 'rule rule:' à 'class Règle (objet):' – Daenyth

+0

@All, édité le code ci-dessus. – AbbaShareen

Répondre

0

En supposant que votre objet a seulement un attribut de titre qui est pertinent pour l'égalité, il faut mettre en œuvre la méthode __eq__ comme suit:

class YourObject: 
    [...] 
    def __eq__(self, other): 
     return self.title == other.title 

Bien sûr, si vous avez d'autres attributs qui sont pertinents pour l'égalité, vous doit inclure ceux aussi bien. Vous pouvez également envisager d'implémenter __ne__ et __cmp__ pour un comportement cohérent.