天儿真好,
我试图找到拖曳字典的函数的递归深度,我有点迷失了...... 目前我有类似的东西:
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)的返回值。
如果我发表一份印刷声明
for i in d.keys():
然后我至少可以打印递归的最高值,但返回值是另一回事......
我确信这很简单 - 我刚买了果冻。
干杯
答案 0 :(得分:10)
确保将递归调用的结果分配给 depth 。另外,正如@amit所说,考虑使用 max ,以便您可以使用多个键值对(树状结构)处理dicts。
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
答案 1 :(得分:2)
你应该存储从递归调用中恢复的值,并返回找到的最大值,否则 - 你正在调用递归函数而不对返回值做任何事情! [并且按预期返回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
答案 2 :(得分:2)
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
如果包括列表,这里的代码工作正常。
答案 3 :(得分:0)
我不可能击败Raymond Hettinger,如果他是 THE 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
答案 4 :(得分: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