最新消息:20210917 已从crifan.com换到crifan.org

【已解决】anytree创建节点期间如何定位查找某个节点

节点 crifan 450浏览 0评论
折腾:
【未解决】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值
去看看如何实现
Node Classes — anytree 2.8.0 documentation
没有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创建节点期间如何定位查找某个节点

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
90 queries in 0.209 seconds, using 23.36MB memory