Python: create a nested dictionary from a list of parent child values

后端 未结 2 1404
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-14 03:47

Here is the input:

list_child_parent= [
    #first value is child, second is parent
    (0, 1),
    (1, 3),
    (8, 7),
    (3, 6),
    (4, 3),
    (5, 3)
]
         


        
相关标签:
2条回答
  • 2021-01-14 04:08

    Not pretty and probably not Pythonic, but it should get you going:

    #!/usr/bin/env python3
    
    def make_map(list_child_parent):
        has_parent = set()
        all_items = {}
        for child, parent in list_child_parent:
            if parent not in all_items:
                all_items[parent] = {}
            if child not in all_items:
                all_items[child] = {}
            all_items[parent][child] = all_items[child]
            has_parent.add(child)
    
        result = {}
        for key, value in all_items.items():
            if key not in has_parent:
                result[key] = value
        return result
    
    if __name__ == '__main__':
        list_child_parent = [
            #first value is child, second is parent
            (0, 1),
            (1, 3),
            (8, 7),
            (3, 6),
            (4, 3),
            (5, 3)
        ]
    
        actual = make_map(list_child_parent)
    
        expected = {
            6: {
                3: {
                    1: {
                        0: {}
                    },
                    4: {},
                    5: {}
                }
            },
            7: {
                8: {}
            }
        }
        print('OK' if expected == actual else 'FAIL')
    
    0 讨论(0)
  • 2021-01-14 04:21

    This code will convert a tree from the given format into a tree structured dictionary. It's a lot of fluf, but it helps to keep track of what is happening. Performance wise it's pretty good.

    LIST_CHILD_PARENTS = [                                                     
    #first value is child, second is parent                                    
    (0, 1),                                                                    
    (1, 3),                                                                    
    (8, 7),                                                                    
    (3, 6),                                                                    
    (4, 3),                                                                    
    (5, 3)                                                                     
    ]                                                                          
    
    
    class Node(object):                                                        
        def __init__(self, value):                    
            self.value = value
            # List of references to Node()'s.                                                
            self.child = []              
            # Reference to parent Node()                                                                           
            self.parent = None                                               
        def set_parent(self, parent):                                          
            self.parent = parent                                               
        def set_child(self, child):                                            
            self.child.append(child)                                           
    
    
    def get_a_root(items):                                                     
        """Find a root node from items.                                        
    
        Grab some node and follow the parent pointers to a root.               
        """                                                                    
        cur_key = list(items.keys())[0]                                              
        while items[cur_key].parent is not None:                               
            cur_key = items[cur_key].parent.value                              
        parent = items[cur_key]                                                
        return parent                                                          
    
    def extract_tree(items, root):                                             
        """Remove the tree from root in items.                                 
        """                                                                    
        cur_key = root.value                                                   
        this_node = items[cur_key]                                             
        if len(this_node.child) == 0:                                          
            items.pop(cur_key)                                                 
            return                                                             
        else:                                                                  
            for child in this_node.child:                                      
                extract_tree(items, child)                                     
            items.pop(cur_key)                                                  
    
    def insert_from_root(tree, root):                                          
        """Insert the dictionary items from a tree.                            
        """                                                                    
        current = root                                                         
        if len(current.child) == 0:                                            
            tree[current.value] = {}                                           
            return                                                             
        else:                                                                  
            table = {}                                                         
            for child in current.child:                                        
                insert_from_root(table, child)                                 
            tree[current.value] = table                                                                                                
    
    def build_graphs():                                                        
        """Map all input graphs into Node(object)'s.           
    
        Return: A hash table by value: Node(value, child, parent)              
        """                                                                    
        items = {}                                                             
        for child, parent in LIST_CHILD_PARENTS:                               
            if not child in items:                                       
                c_n = Node(child)  
                items[child] = c_n                 
            else:                                                              
                c_n = items[child]                                             
            if not parent in items:                                      
                p_n = Node(parent) 
                items[parent] = p_n                    
            else:                                                              
                p_n = items[parent]                                            
            p_n.set_child(c_n)                                                 
            c_n.set_parent(p_n)                                                                                       
        return items                                                           
    
    def run_dict_builder():                                                    
        """Map the graphs from input and map into a dict.                                  
    
        Sequence:                                                              
            1- Map all graphs from input trees: list(tuple)             
            2- For each root node:                                             
                2A - Get a root node.                                      
                2B - Extract tree under this root from graphs list.                  
                2C - Insert the tree from this root into dict.                      
            3- Return the Dictionary Tree structure.                                                     
        """                                                                    
        graphs = build_graphs()                                                
    
        h_table = {}                                                           
        while len(graphs) > 0:                                                 
            root = get_a_root(graphs)                                          
            extract_tree(graphs, root)                                
            insert_from_root(h_table, root)                          
        return h_table                                                         
    
    print(run_dict_builder())
    
    0 讨论(0)
提交回复
热议问题