如何找到表达的深度?

时间:2015-09-14 06:55:24

标签: python python-2.7

我已经尝试过这段代码来找到表达的深度。你能不能告诉我哪里出错了,以及我该怎么做才能得到正确的答案。

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                

2 个答案:

答案 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时,它不改变地返回当前深度。 然后,通过存储和比较当前深度,我们可以找到最大深度。 希望对您有所帮助。