简体   繁体   中英

Create nested dictionary using keypath in Python

There is a nested dictionary with multiple level of keys. The requirements are:

  • Create nested keys by using keypath if it doesn't exist
  • Update the value by using the keypath if it exists

For example, this is the dictionary:

{
    "animal": {
        "dog": {
            "type": "beagle"
        }
    },
    "man": {
        "name": "john",
        "age": 36
    },
    "plant": {
        "fruit": {
            "apple": {
                "type": "gala"
            }
        }
    }
}

Here are the functions to update the value or append a new nested keypath:

appendDict(["man", "name"], "daniel", json_dict)
appendDict(["computer", "laptop", "maker"], "hp", json_dict)

Here is the expected result:

{
    "animal": {
        "dog": {
            "type": "beagle"
        }
    },
    "man": {
        "name": "daniel",
        "age": 36
    },
    "plant": {
        "fruit": {
            "apple": {
                "type": "gala"
            }
        }
    },
    "computer": {
        "laptop": {
            "maker": "hp"
        }
    }    
}

My question is how to implement the appendDict() function in order to support the requirements?

Here is my code so far which doesn't work yet:

json_dict = {    
    "animal": {"dog": {"type": "beagle"}},
    "man": {"name": "john", "age": 36},
    "plant": {"fruit": {"apple": {"type": "gala"}}}
}

def appendDict(keys, value, json_dict):
    for index, key in enumerate(keys):
        if key not in json_dict:
            if index == len(keys) - 1:
                some_data = {}
                some_data[key] = value
                json_dict[key] = some_data
            else:
                some_data = {}
                json_dict[key] = some_data
        else:
            json_dict[key] = value
            
appendDict(["man", "name"], "daniel", json_dict)            
appendDict(["computer", "laptop", "maker"], "hp", json_dict)

You can use recursion by slicing keys at every call:

def appendDict(keys, value, json_dict):
   if len(keys) == 1:
      json_dict[keys[0]] = value
   else:
      if keys[0] not in json_dict:
         json_dict[keys[0]] = {}
      appendDict(keys[1:], value, json_dict[keys[0]])

json_dict = {'animal': {'dog': {'type': 'beagle'}}, 'man': {'name': 'john', 'age': 36}, 'plant': {'fruit': {'apple': {'type': 'gala'}}}}
appendDict(["man", "name"], "daniel", json_dict)
appendDict(["computer", "laptop", "maker"], "hp", json_dict)

import json
print(json.dumps(json_dict, indent=4))

Output:

{
  "animal": {
     "dog": {
        "type": "beagle"
     }
  },
  "man": {
     "name": "daniel",
     "age": 36
   },
   "plant": {
       "fruit": {
          "apple": {
              "type": "gala"
           }
       }
    },
    "computer": {
        "laptop": {
          "maker": "hp"
       }
    }
}

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