如何检查对象列表中是否存在对象?

时间:2015-12-28 18:32:33

标签: python list class object

我使用Python来实现一个Earley Parser,它具有如下定义的Context Free规则:

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__函数,但它似乎没有用。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

假设您的对象只有一个与相等性相关的title属性,您必须按如下方式实现__eq__方法:

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

当然,如果您有更多与平等相关的属性,那么您也必须包含这些属性。您也可以考虑实施__ne____cmp__以保持一致的行为。