Search code examples
pythondictionaryrecursionnested

Replace keys in a nested dictionary


I have a nested dictionary {1: {2: {3: None}}} and a dictionary that maps keys of the nested dictionary to a set of values such as {1: x, 2: y, 3: z}. I want to transform the nested dictionary to this form {x: {y: {z: None}}}. I have tried a couple of recursive functions but I keep going in circles and confusing myself. What is the best way to achieve this?

The level of nesting is arbitrary. The above is a simple example.


Solution

  • You need to recurse through the dictionary while building a new one with new keys. Note that if you have a list or tuple in there somewhere that has other dictionaries in it, they won't be processed - you'd have to add some code to do that. You can actually do this without building a new dictionary, but I think this way is simpler.

    od = { 1: { 2: { 3: None }}}
    kd = { 1: 'x', 2: 'y', 3: 'z' }
    
    def replace_keys(old_dict, key_dict):
        new_dict = { }
        for key in old_dict.keys():
            new_key = key_dict.get(key, key)
            if isinstance(old_dict[key], dict):
                new_dict[new_key] = replace_keys(old_dict[key], key_dict)
            else:
                new_dict[new_key] = old_dict[key]
        return new_dict
    
    nd = replace_keys(od, kd)
    print nd
    

    outputs:

    {'x': {'y': {'z': None}}}