2015-12-28 229 views
1

我使用Python來實現的厄雷分析器已定義上下文無關規則如下:如何檢查對象列表中是否存在對象?

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) 

其中圖表是應該包含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__函數,但它似乎不起作用。任何人都可以幫助我一樣嗎?

+0

你是否100%確定'self.chart [entry]'是一個列表?從錯誤消息看來,'self.chart [entry]'是一個字符串。 'enqueue'開始時如果你使用'print type(self.chart [entry])'顯示什麼? – Kevin

+2

將'class rule:'更改爲'class Rule(object):' – Daenyth

+0

@所有,編輯上面的代碼。 – AbbaShareen

回答

0

假設你的對象只有是相關的平等title屬性,你必須實現__eq__方法如下:

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

當然,如果你有更多的屬性,這些屬性是相關的平等,你也必須包括這些。您也可以考慮實施__ne____cmp__以獲得一致的行爲。