【问题标题】:How to find depth of an expression?如何找到表达式的深度?
【发布时间】:2015-12-10 02:23:57
【问题描述】:

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

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                

【问题讨论】:

标签: python python-2.7


【解决方案1】:

一个字母的森林太令人瞠目结舌,难以追随;我可以帮助您改进调试实践。

(1) 您在几个有用的地方都有打印语句,但您还应该标记输出以使跟踪更具可读性。

(2) 使用好的变量名。单字母变量并不能告诉我们太多。例如,“k”没有告诉我目的。我无法知道“k=k+1”是否在正确的位置。

(3) 不要在计算中使用全局变量。如果这是一个递归例程,则以这种方式编码。称之为“list_depth”;它接受一个列表并返回一个整数,即该对象的深度。你写这个的方式,它似乎返回一个原子的“xyz”(“xyz”是什么意思???)以及一些复杂的计算。

(4) 顶部的那些成对的“if”语句显示了有缺陷的逻辑。测试一次类型:如果是列表/元组,则递归查找深度;如果不是,则返回深度 1。

我希望这可以帮助您简化和改进您的算法。

【讨论】:

  • 另外一个细节:一个原子,比如一个简单的整数,深度是 0 还是 1?您的代码假定它是 1。这可能是您的关键问题。
【解决方案2】:

最近,我碰巧遇到了这个问题,找不到任何明确的指南。所以我想把这个答案留给将来可能需要它的人。

我尝试了许多替代方案并想出了这个解决方案。

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 时,它​​会返回当前深度而不做任何更改。 然后通过存储和比较当前深度我们可以找到最大深度。 我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2020-07-05
    • 2013-03-20
    • 1970-01-01
    • 2013-04-15
    • 2012-03-23
    • 1970-01-01
    相关资源
    最近更新 更多