使用哈希获取 Python 中两个对象列表之间的差异
Obtain difference between two lists of objects in Python using hash
我的objective是获取两个包含对象的列表之间的差异。
我实现了一个名为 Branch 的 class 并重写了它的 __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
但是我希望只输出 branch3,因为 b1
和 b1b
应该被视为相等。
是否可以使用集合来解决这个问题?或者我应该从不同的角度来处理这个问题?
您需要实施 hash,具体选择取决于您,但以下方法可行:
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))
我的objective是获取两个包含对象的列表之间的差异。
我实现了一个名为 Branch 的 class 并重写了它的 __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
但是我希望只输出 branch3,因为 b1
和 b1b
应该被视为相等。
是否可以使用集合来解决这个问题?或者我应该从不同的角度来处理这个问题?
您需要实施 hash,具体选择取决于您,但以下方法可行:
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))