[英]How to check if an object exists inside a list of objects?
我正在使用Python来实现Earley解析器,该解析器具有如下定义的上下文无关规则:
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
为了检查图表数组中是否存在Rule
类的对象,我使用了以下方法:
def enqueue(self, entry, state):
if state in self.chart[entry]:
return None
else:
self.chart[entry].append(state)
其中chart是一个数组,应该包含Rule
类的对象列表:
def __init__(self, words):
self.chart = [[] for i in range(len(words))]
进一步,我检查如下规则是否存在,如chart[entry]
中所示(如果不存在,则简单地追加):
def enqueue(self, entry, state):
if state in self.chart[entry]:
return None
else:
self.chart[entry].append(state)
但这给我一个错误
TypeError: 'in <string>' requires string as left operand, not classobj
为了避免这种情况,我什至在类本身中声明了一个__eq__
函数,但它似乎不起作用。 有人可以帮我吗?
假设您的对象只有与平等相关的title属性,则必须实现__eq__
方法,如下所示:
class YourObject:
[...]
def __eq__(self, other):
return self.title == other.title
当然,如果您拥有更多与平等相关的属性,则还必须包括这些属性。 您也可以考虑实现__ne__
和__cmp__
以获得一致的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.