我已经尝试过这段代码来找到表达的深度。你能不能告诉我哪里出错了,以及我该怎么做才能得到正确的答案。
k=0
m=0
def fn(x):
global k,m
if isinstance(x,(tuple,list))== False : return "xyz"
if isinstance(x,(tuple,list))== True :
k=k+1
if k>m: m=k
for i in x:
print i
print k
if isinstance (i,(list,tuple)):
fn(i)
else:
if k>1: k=m
else:k=1
fn([[['x',[1,[8,9],2],'y',[7,6]]]])
print "depth is",m
答案 0 :(得分:0)
一个字母的森林太容易让人难以理解;我可以帮助您改进调试实践。
(1)您在几个有用的地方都有打印语句,但您还应该标记输出以使跟踪更具可读性。
(2)使用好的变量名。单字母变量并不能告诉我们多少。例如,' k'告诉我没有目的。我无法知道" k = k + 1"是在正确的位置。
(3)不要使用全局变量进行计算。如果这是一个递归例程,那么就这样编码。叫它" list_depth&#34 ;;它接受一个列表并返回一个整数,即该对象的深度。你写这篇文章的方式,似乎回归" xyz"对于一个原子(" xyz"是什么意思???)和一些复杂的计算。
(4)那些配对"如果"顶部的陈述显示有缺陷的逻辑。测试类型一次:如果它是列表/元组,则重复查找深度;如果没有,返回深度为1。
我希望这可以帮助您简化和改进算法。
答案 1 :(得分:0)
最近,我碰巧遇到了这个问题,找不到任何明确的指南。因此,我想将这个答案留给将来可能需要的人。
我尝试了许多替代方法,并提出了此解决方案。
def depth(in_data, current_depth=0):
current_max_depth = 0
if isinstance(in_data, (list, tuple)):
current_depth += 1
for data in in_data:
d = depth(data, current_depth)
if d > current_max_depth:
current_max_depth = d
return current_max_depth
return current_depth
在此代码中,每次程序对isinstance()
返回true时,它都会将当前深度加1,并将此当前深度与新元素一起再次传递给函数。当返回false时,它不改变地返回当前深度。
然后,通过存储和比较当前深度,我们可以找到最大深度。
希望对您有所帮助。