parse a dot seperated string into dictionary variable

前端 未结 4 359
北荒
北荒 2021-01-25 08:27

I have string values as,

\"a\"
\"a.b\"
\"b.c.d\"

How to convert them into python dictionary variables as,

a
a[\"b\"]
b[\"c\"][\         


        
4条回答
  •  盖世英雄少女心
    2021-01-25 09:18

    I ran into this same problem for parsing ini files with dot-delimited keys in different sections. e.g.:

    [app]
    site1.ftp.host = hostname
    site1.ftp.username = username
    site1.database.hostname = db_host
    ; etc..
    

    So I wrote a little function to add "add_branch" to an existing dict tree:

    def add_branch(tree, vector, value):
        """
        Given a dict, a vector, and a value, insert the value into the dict
        at the tree leaf specified by the vector.  Recursive!
    
        Params:
            data (dict): The data structure to insert the vector into.
            vector (list): A list of values representing the path to the leaf node.
            value (object): The object to be inserted at the leaf
    
        Example 1:
        tree = {'a': 'apple'}
        vector = ['b', 'c', 'd']
        value = 'dog'
    
        tree = add_branch(tree, vector, value)
    
        Returns:
            tree = { 'a': 'apple', 'b': { 'c': {'d': 'dog'}}}
    
        Example 2:
        vector2 = ['b', 'c', 'e']
        value2 = 'egg'
    
        tree = add_branch(tree, vector2, value2)    
    
        Returns:
            tree = { 'a': 'apple', 'b': { 'c': {'d': 'dog', 'e': 'egg'}}}
    
        Returns:
            dict: The dict with the value placed at the path specified.
    
        Algorithm:
            If we're at the leaf, add it as key/value to the tree
            Else: If the subtree doesn't exist, create it.
                  Recurse with the subtree and the left shifted vector.
            Return the tree.
    
        """
        key = vector[0]
        tree[key] = value \
            if len(vector) == 1 \
            else add_branch(tree[key] if key in tree else {},
                            vector[1:],
                            value)
        return tree
    

提交回复
热议问题