繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM