2016-02-26 2 views
0

J'ai une classe qui ressemble à ceci:Comparaison de deux objets avec des listes imbriquées en tant que propriétés

class Foo(object): 
    def __init__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c # c is presumed to be a list 
    def __eq__(self, other): 
     return self.a == other.a and self.b == other.b 

Cependant, dans ce cas, « c » pourrait être une liste de Foos, avec s « c » qui contient liste des Foos, ex quelque chose comme:

[Foo(1,2), Foo(3,4,[Foo(5,6)])] 

Quelle est une bonne approche pour faire face à ce type de comparaison d'objets, étant donné la structure de la liste/structure de l'objet? Je suppose que simplement faire un self.c == other.c est insuffisant pour cela.

+1

Pourquoi pensez-vous que c'est un problème? Si vous comparez des listes, Python va comparer les éléments pour déterminer s'ils sont égaux (en supposant qu'ils ont la même longueur, qui est vérifiée en premier). Voir par exemple http://stackoverflow.com/q/29215418/3001761 – jonrsharpe

+0

Fixez votre '__eq__' pour utiliser' == 'au lieu de' = 'et incluez la comparaison de' c'. –

+0

'retourner tout (getattr (self, n) == getattr (autre, n) pour n dans ('a', 'b', 'c'))' – Kupiakos

Répondre

0

votre méthode de fixation __eq__

class Foo(object): 
    def __init__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c # c is presumed to be a list 
    def __eq__(self, other): 
     return self.a == other.a \ 
       and self.b == other.b and self.c == other.c 

a,b = Foo(2,3), Foo(5,6) 
c = Foo(1,2, [a,b]) 
d = Foo(1,2) 
e,f = Foo(2,3), Foo(5,6) 
g = Foo(1,2, [e,f]) 

print c == d #False 
print c == g #True 
-2

Une solution générique pour n attributs Foo:

class Foo(object): 
    def __init__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c # c is presumed to be a list 

    def __eq__(self, other): 
     for attr, value in self.__dict__.iteritems(): 
      if not value == getattr(other, attr): 
       return False 
     return True 


item1 = Foo(1, 2) 
item2 = Foo(3, 4, [Foo(5, 6)]) 
item3 = Foo(3, 4, [Foo(5, 6)]) 

print(item1 == item2) # False 
print(item3 == item2) # True 
+0

vous pouvez également ajouter une vérification de type pour éviter les faux positifs. 'si ce n'est pas soi .__ class__ == autre .__ class__: return False' –

+0

N'était pas moi, désolé. –