2016-10-07 88 views
2

我的目標是獲得包含對象的兩個列表之間的差異。在Python中使用散列獲取兩個對象列表之間的差異

我已經實現了一個名爲科類和如下覆蓋其__eq____ne__方法:

class Branch(object): 
    def __str__(self): 
     return self.name 

    def __eq__(self, other): 
     if isinstance(other, Branch): 
      return (self.valueFrom == other.valueFrom) \ 
       and (self.valueTo == other.valueTo) \ 
       and (self.inService == other.inService) 
     return NotImplemented 

    def __ne__(self, other): 
     result = self.__eq__(other) 
     if result is NotImplemented: 
      return result 
     return not result 

    def __init__(self, name, valueFrom, valueTo, inService=True): 
     self.name = name 
     self.valueFrom = valueFrom 
     self.valueTo = valueTo 
     self.inService = inService 

我第一次嘗試是從set型使用的方法difference。然而,看起來這是不可能的,因爲它使用了對象的散列,而不是我想要的那樣使用__eq__方法。

下面的代碼顯示問題:

b1 = Branch("branch1", 1, 2) 
b1b = Branch("equal to branch1", 1, 2) 
b2 = Branch("branch2", 2, 3) 
b3 = Branch("branch3", 3, 1) 
b3_off = Branch("branch3 not in service", 3, 1, False) 

l1 =[b1,b2,b3] 
l2 =[b1b,b2,b3_off] 

difference = set(l1).difference(l2) 
for branch in difference: 
    print branch 

輸出是:

>>> 
branch1 
branch3 

不過,我希望得到的輸出僅作爲店3和b1應該b1b平等對待。

是否可以使用sets來解決這個問題?或者我應該從不同的角度來看問題嗎?

+0

可能重複[獲取兩個列表之間的差異](http://stackoverflow.com/questions/3462143/get-difference-between-two-lists) –

回答

4

您需要實現哈希,你選擇由你,但下面將工作內容:

def __hash__(self): 
    return hash((self.valueFrom , self.valueTo , self.inService)) 

所有你需要實現的哈希和EQ:

class Branch(object): 
    def __init__(self, name, valueFrom, valueTo, inService=True): 
     self.name = name 
     self.valueFrom = valueFrom 
     self.valueTo = valueTo 
     self.inService = inService 

    def __eq__(self, other): 
     if isinstance(other, Branch): 
      return (self.valueFrom,self.valueTo,self.inService)\ 
        ==(other.valueFrom, other.valueTo, other.inService) 
     return NotImplemented 

    def __str__(self): 
     return self.name 

    def __hash__(self): 
     return hash((self.valueFrom, self.valueTo,self.inService)) 
+2

你的「你也可以......」應該是正確的答案。 '(1,2,1)'和'(2,1,1)'的總和相同,並不意味着它們是相同的對象。 – rantanplan

+0

@rantanplan,真的,我沒有給它一個很大的想法,因爲我推測真正的數據可能有點不同,即使使用'self.valueFrom + self.valueTo + self.inService'仍然可以工作,但明顯少如果您確實擁有數字,那麼效率將會回落到eq。 –

+0

你已經得到了我的投票,但我不明白你爲什麼說它會奏效。從OP發佈的代碼中我看不到'self.valueFrom'與'self.valueTo'相同。如果他們*發生*具有相同的值是...以及只是,偶然發生:)但也許我錯過了一些東西 – rantanplan

相關問題