Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python字典的递归深度_Python_Recursion_Dictionary - Fatal编程技术网

python字典的递归深度

python字典的递归深度,python,recursion,dictionary,Python,Recursion,Dictionary,G'day 我试图找到一个函数的递归深度,这个函数拖网了一个字典,我有点迷路了。。。 目前我有一些类似于: myDict = {'leve1_key1': {'level2_key1': {'level3_key1': {'level4_key_1': {'level5_key1': 'level5_value1'}}}}} 我想知道嵌套最多的字典是如何嵌套的。。。所以我做了以下几件事 def dict_depth(d, depth): for i in d.keys():

G'day

我试图找到一个函数的递归深度,这个函数拖网了一个字典,我有点迷路了。。。 目前我有一些类似于:

myDict = {'leve1_key1': {'level2_key1': {'level3_key1': {'level4_key_1': {'level5_key1':   'level5_value1'}}}}}
我想知道嵌套最多的字典是如何嵌套的。。。所以我做了以下几件事

def dict_depth(d, depth):

    for i in d.keys():
        if type(d[i]) is dict:
            newDict = d[i]
            dict_depth(newDict, depth+1)
    return depth

print dict_depth(myDict, 0)
唯一的问题是,递归循环只返回最终值(0)的返回。 如果我写一份打印的声明
对于i in d.keys():
那么我至少可以打印递归的最高值,但返回值是另一回事

我相信这很简单——我只是有个水母脑


干杯

您应该存储递归调用返回的值,并返回找到的最大值,否则-您调用递归函数时没有对返回的值做任何操作![并按预期返回0,因为它从未更改]

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

确保将递归调用的结果分配给depth。同样,正如@ Amit所说的,考虑使用Max,这样您就可以处理具有多个键值对(树形结构)的DICT。
我不可能打败雷蒙德·赫廷格,如果他是R.H.;-)但我找到了一个类似的解决方案,用一些打印语句来说明发生了什么

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

非递归版本:

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

如果还包含了偶数列表,则代码可以正常工作。

请注意,如果字典的键数超过1,则在深度上不使用
max()
,您可能会用较小的值覆盖
depth
。@amit我同意。从OP的代码开始总是很危险的:-)@RaymondHettinger:对我来说非常合适,可以打印“4”。我在这里假设OP希望外部字典为“0”。您在这里找不到任何限制(可用内存除外)。每个嵌套字典都是一个新对象,它对其父对象一无所知。但您的代码可能会遇到堆栈溢出。这与任何词典限制无关。
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
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