Brian Zheng
Brian Zheng

Reputation: 449

get the value of the deepest nested dict in python

I have a dictionary like

{a:{b:{c:{d:2}}}, e:2, f:2}

How am I supposed to get the value of d and change it in python? Previous questions only showed how to get the level of nesting but didn't show how to get the value. In this case, I do not know the level of nesting of the dict. Any help will be appreciated, thank you!!! P.S. I am using python 3

Upvotes: 2

Views: 3016

Answers (2)

Neil Dixit
Neil Dixit

Reputation: 21

I was searching for a similar solution, but I wanted to find the deepest instance of any key within a (possibly) nested dictionary and return it's value. This assumes you know what key you want to search for ahead of time. It's unclear to me if that is a valid assumption for the original question, but I hope this will help others if they stumble on this thread.

def find_deepest_item(obj, key, deepest_item = None):
if key in obj: 
    deepest_item = obj[key]
for k, v in obj.items():
    if isinstance(v,dict):
        item = find_deepest_item(v, key, deepest_item)
        if item is not None:
            deepest_item = item
return deepest_item

In this example, the 'd' key exists at the top level as well:

d = {'a':{'b':{'c':{'d':25}}}, 'd':3, 'e':2, 'f':2}
v = find_deepest_item(d, 'd')
# 25

Search for 'c':

v = find_deepest_item(d, 'c')
# {'d': 25}

Upvotes: 2

gold_cy
gold_cy

Reputation: 14226

How about some recursion?

def unest(data, key):
    if key in data.keys():
        return data.get(key)
    else:
        for dkey in data.keys():
            if isinstance(data.get(dkey), dict):
                return unest(data.get(dkey), key)
            else:
                continue

d = {'a':{'b':{'c':{'d':25}}}, 'e':2, 'f':2}

r = unest(d, 'd')
# 25

r = unest(d, 'c')
# {'d': 25}

Edit: As Paul Rooney points out we don't have to use data.keys, we can simply iterate over the keys by doing if key in data

Edit 2: Given the input you provided this would find the deepest level, however this does not cover certain cases, such as where for example, key e is also a nested dictionary that goes n + 1 levels where n is equal to the depth of key a.

def find_deepest(data):
    if not any([isinstance(data.get(k), dict) for k in data]):
        return data
    else:
        for dkey in data:
            if isinstance(data.get(dkey), dict):
                return find_deepest(data.get(dkey))
            else:
                continue

u = find_deepest(d)
# {'d': 2}

Upvotes: 5

Related Questions