Recursive depth of python dictionary

前端 未结 5 1707
一向
一向 2020-12-06 12:24

G\'day,

I am trying to find the recursive depth of a function that trawls a dictionary and I\'m a bit lost... Currently I have something like:

myDict         


        
相关标签:
5条回答
  • 2020-12-06 12:41

    A non-recursive version:

    def depth(d):
    
        depth=0
        q = [(i, depth+1) for i in d.values() if isinstance(i, dict)]
        max_depth = 0
        while (q):
            print q
            n, depth = q.pop()
            max_depth = max(max_depth, depth)
            q = q + [(i, depth+1) for i in n.values() if isinstance(i, dict)]
    
        print max_depth
    
    0 讨论(0)
  • 2020-12-06 12:42

    Be sure to assign the result of the recursive call to depth. Also, as @amit says, consider using max so that you can handle dicts with multiple key value pairs (a treelike structure).

    def dict_depth(d, depth=0):
        if not isinstance(d, dict) or not d:
            return depth
        return max(dict_depth(v, depth+1) for k, v in d.iteritems())
    
    >>> myDict = {'leve1_key1': {'level2_key1': 
                   {'level3_key1': {'level4_key_1': 
                      {'level5_key1':   'level5_value1'}}}}}
    >>> dict_depth(myDict)
    5
    
    0 讨论(0)
  • 2020-12-06 12:45

    You should store the value retured from the recursive call, and return the max value found, otherwise - you are calling the recursive function without doing anything with the returned value! [and returning 0 as expected, since it was never changed]

    def dict_depth(d, depth):
        ret = depth 
        for i in d.keys():
            if type(d[i]) is dict:
                newDict = d[i]
                ret = max(dict_depth(newDict, depth+1),ret) #finding max and storing it
        return ret #returning the max found
    
    0 讨论(0)
  • 2020-12-06 12:50

    I can't possible beat Raymond Hettinger, if he is THE R.H. ;-) But i came to a similar solution with some print statements to illustrate what's happening!

    d = {1: 2, 2: {3: {5: 6}}, 3: {4: 4}, 7: 8}
    def recursion_depth(dict_, depth):
        for k in dict_:
            print "key{0}:value{1} = depth:{2}".format(k, dict_[k], depth)
        if type(dict_[k]) == dict:
            actual_depth = recursion_depth(dict_[k], depth+1)
            if actual_depth > depth: depth += 1
        return depth
    
    >>>recursion_depth(d,0)
    key1:value2 = depth:0
    key2:value{3: {5: 6}} = depth:0
    key3:value{5: 6} = depth:1
    key5:value6 = depth:2
    key3:value{4: 4} = depth:1
    key4:value4 = depth:2
    key7:value8 = depth:2
    2
    
    0 讨论(0)
  • 2020-12-06 13:05
    MyDict = {'a': {'a1': {'a11': 5, 'a12':[{2:'a22'}], 'a13':{'a14':'a11'}}, 'a2': 6}, 'b':{7:{8:{9:{10:{11:'11'}}}}}, 'c': {'c1': 18, 'c2': 1}}
    
    def find_depth(dep,val):
        if isinstance(val,dict):
            dep=dep+1
            for j in val:
                find_depth(dep,val[j])
            temp_depth.append(dep)
            dep=0
            return max(temp_depth)
        elif isinstance(val,list):
            for k in val:
                find_depth(dep,k)
    
    
    max_depth={}
    for i in MyDict:
        dep=0
        temp_depth=[]
        max_depth.update({i:(find_depth(dep,MyDict[i]))})
        print max_depth
    

    Here is code works fine if even list also included.

    0 讨论(0)
提交回复
热议问题