简体   繁体   中英

Get child node if exists otherwise create in Python

I have a basic class containing two attributes 'Name' and 'Children.

class Node():
    def __init__(self, name):
        self.name = name
        self.children = []

I have a core root node as follows:

# Create Master Root Node
root = Node('root')

How would I go about creating a function that I could pass a path to a specific node in the tree, and the function return that node. However if that node doesn't exist it would create/append to the tree, and still return the node.

path = ['Leslie','Marie','Tori'] # simple example

def get_node_by_path(path=[])...

If a path failed before reaching the end of the path, it would automatically create the missing nodes in order to make the entire path complete.

在此处输入图片说明

path = ['Leslie','Marie','Tori','Kevin'] # more complex requires two nodes to be created

def get_node_by_path(path=[])...

在此处输入图片说明

I'd do something like this. It's a non recursive solution.

def get_node_by_path(path):
    cur_node = root
    for elem_name in path:
        found = False
        for child in cur_node.children:
            if child.name == elem_name:
                cur_node = child
                found = True
                break
        if not found:
            new_node = Node(elem_name)
            cur_node.children.append(new_node)
            cur_node = new_node
    return cur_node
class Node:
    def __init__(self, name):
        self.name = name
        self.children = []

    def path_to(self, path):
        if not path:
            return self
        head, *tail = path
        for child in self.children:
            if child.name == head:
                return child.path_to(tail)
        newborn = Node(head)
        self.children.append(newborn)
        return newborn.path_to(tail)

Here's a solution that recursively considers whether the first name in the list is a child of the current node.

For Python 2, head, *tail = path can be replaced with

head = path[0]
tail = path[1:]

start with the last dag object and go to the root

class Node():
    def __init__(self, name = "", childern = []):
        self.name = name
        self.children = childern
        print ("Node Name: {0} Childern Nodes {1}".format(self.name, self.children))

def get_node_by_path(path=[]):
    for c,n in enumerate(reversed(path)):
        if not c:
            Node(name = n)
        else:
            Node(name = n, childern = path[-c:])

path = ['root', 'Leslie','Marie','Tori','Kevin']
get_node_by_path(path)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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