我有一些复杂对象的Python列表,还有一个目标对象,我希望根据值在列表中检查它的出现。
换句话说,我需要查找列表中的任何对象是否具有与目标对象相同的属性和相同的值。
我尝试过:
if node in nodes:
但这会比较对象的引用而不是值。
我知道我可以做一些嵌套循环来检查每个属性,但是我正在寻找一种更聪明的方法。
非常感谢。
答案 0 :(得分:1)
您可以定义Node
类的__eq__
方法来将有趣的属性与其他节点进行比较:
class Node:
def __init__(self, val1, val2):
self.val1 = val1
self.val2 = val2
def __eq__(self, other):
return self.val1 == other.val1 and self.val2 == other.val2
nodes = [Node(1, 2), Node(3, 4), Node(5, 6)]
node = Node(1, 2)
print(node in nodes) # True
如果由于担心破坏旧行为而不想编写__eq__
方法,则可以编写仅检查某些属性然后使用any
的自定义相等方法。例如:
def val1s_equal(n1, n2):
return n1.val1 == n2.val1
if any(val1s_equal(node, n) for n in nodes):
print('do something')