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?
Ê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
Modifier 'rule rule:' à 'class Règle (objet):' – Daenyth
@All, édité le code ci-dessus. – AbbaShareen