[英]How to check if 2 class objects have same parameters inside a list in python?
我有一个 AI 算法程序,我在其中将节点(object 类)添加到列表中进行处理。 我的 Class 构建如下-
def __init__(self, data, parent):
self.data = data
self.parent = parent
self.parentweight = 0
在我的用例中,没有 2 个对象可以具有所有完全相同的参数,因为这应该意味着两者是相同的 object。如果我生成一个节点,它的所有值都与列表中的其他随机节点相同,它应该不会附加到列表中,程序应该继续进行。 我怎样才能做到这一点?
附加到相关列表的代码-
visited = [] #Initiated globally
if (miss_x !=2):
temp_right = Node(self.move_right(miss_y, miss_x), self)
if temp_right not in visited:
visited.append(temp_right)
final.append(temp_right)
这是我想做的伪代码-
if (miss_x !=2):
temp_right = Node(self.move_right(miss_y, miss_x), self)
if (temp_right.data and temp_right.parent) not in visited for any node:
visited.append(temp_right)
final.append(temp_right)
我想过用另一种方法来做这件事——
def not_in(self, visited):
for node in visited:
if (self.data == node.data) and (self.parent==node.parent):
return 0
return 1
但我觉得有更好的方法来做到这一点,因为每次添加另一个节点时检查完整列表似乎很浪费。
我发现的另一条信息是使用 _eq_ 如下 -
def __eq__(self, other) :
return self.__dict__ == other.__dict__
但我不确定如何实施。
在创建Node
的新实例时有效检查先前是否存在的一种方法是使用 Python set
,其中每个元素都是唯一标识Node
的参数tuple
。 例如:
existingNodes = set()
def makeNode(nodeSet, data, parent):
node = Node(data, parent)
tup = (node.data, node.parent)
if tup in nodeSet:
return None
nodeSet.add(tup)
return node
root = makeNode(existingNodes, 0, None)
node = makeNode(existingNodes, 1, root)
node2 = makeNode(existingNodes, 1, root)
[print(f"{'None' if n is None else n.data}") for n in (root, node, node2)]
Output:
0
1
None
在上面的示例中, root
由makeNode()
创建并返回,就像node
一样,但是在尝试创建node2
时,参数被检测为重复项(与node
相同)并且makeDef()
返回 None 以表明这一点。
更新:要以 2D 列表的形式处理数据,正如 OP 所建议的那样,可能需要使用以下方法将数据转换为可散列的嵌套元组,假设 2D 列表在节点的生命周期内不会改变:
class Node:
def __init__(self, data, parent):
self.data = data
self.parent = parent
self.parentweight = 0
existingNodes = set()
def makeNode(nodeSet, nodeData, parent):
node = Node(nodeData, parent)
dataTup = tuple(tuple(x) for x in nodeData.data)
tup = (dataTup, node.parent)
if tup in nodeSet:
return None
nodeSet.add(tup)
return node
class NodeData:
def __init__(self, data):
self.data = data
root = makeNode(existingNodes, NodeData([[1,2],[3,4]]), None)
node = makeNode(existingNodes, NodeData([[5,6],[7,8]]), root)
node2 = makeNode(existingNodes, NodeData([[5,6],[7,8]]), root)
[print(f"{'None' if n is None else n.data.data}") for n in (root, node, node2)]
Output 是:
[[1, 2], [3, 4]]
[[5, 6], [7, 8]]
None
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.