繁体   English   中英

如何检查 2 class 对象在 python 的列表中是否具有相同的参数?

[英]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

在上面的示例中, rootmakeNode()创建并返回,就像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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM