折腾:
【未解决】Python中如何实现Tree树结构且带辅助数据以便于后续计算
期间,已经可以用基本的代码,去创建节点:
from anytree import Node, RenderTree # curRootNode = None rootNodeList = [] for curParentId, curChildIdList in recommandRelationDict.items(): print("curParentId=%s, curChildIdList=%s" % (curParentId, curChildIdList)) # curParentId=a12341234123, curChildIdList=['a12341234121'] curParentNode = Node(curParentId) print("curParentNode=%s" % curParentNode) # curParentNode=Node('/a12341234123') for eachChildId in curChildIdList: curChildNode = Node(eachChildId, parent=curParentNode) print("curChildNode=%s" % curChildNode) # curChildNode=Node('/a12341234123/a12341234121') # curChildNode=Node('/aa1234512333/aa1234512334') # curRootNode = curParentNode.root rootNodeList.append(curRootNode) # for debug for pre, fill, node in RenderTree(curRootNode): # print("pre=%s,fill=%s,node=%s" % (pre, fill, node)) print("%s%s" % (pre, node.name)) print("curRootNode=%s" % curRootNode)
但在创建节点时,有点点麻烦的是
需要在新建节点期间,判断该节点是否已经在里面了
如果已经在里面,则需要更新对应的parent值
去看看如何实现
没有search或find之类的操作
看来只能:
自己记录每次的parent,然后放到一个list中,
然后单独写函数实现:
查到单个id,是否已经存在节点中
去写代码
rootNodeList = [] def findNode(nodeName): foundNode = None for eachRootNode in rootNodeList: if foundNode: break if nodeName == eachRootNode.name: foundNode = eachRootNode break curChildNodeList = eachRootNode.children for eachEachChildNode in curChildNodeList: if nodeName == eachEachChildNode.name: foundNode = eachEachChildNode break return foundNode for curParentId, curChildIdList in recommandRelationDict.items(): print("curParentId=%s, curChildIdList=%s" % (curParentId, curChildIdList)) # curParentId=a12341234123, curChildIdList=['a12341234121'] curExistedParentNode = findNode(curParentId) if curExistedParentNode: curParentNode = curExistedParentNode else: curParentNode = Node(curParentId)
看看效果

可以看到,name是传入的值,不是刚差点误以为的path的值了。
【总结】
后续继续优化,暂时用:
rootNodeList = [] def findNode(nodeName): foundNode = None for eachRootNode in rootNodeList: if foundNode: break if nodeName == eachRootNode.name: foundNode = eachRootNode break curChildNodeList = eachRootNode.children for eachEachChildNode in curChildNodeList: if nodeName == eachEachChildNode.name: foundNode = eachEachChildNode break return foundNode
调用:
existedParentNode = findNode(curParentId) existedChildNode = findNode(eachChildId)
去实现:
对于任何一个parent或child,去里面根据name是否相同,而查找到对应的节点
注:
如果对于一个rootNode,则判断一个节点是否在这个tree中,其实更简单,只需要去判断:
rootNode.children
即 所有的子节点中,是否有对应name为要查询的someId即可。
转载请注明:在路上 » 【已解决】anytree创建节点期间如何定位查找某个节点