Python3递归参数麻烦

我很难指出我在递归子例程中做错了什么。


惯例是:


def Validate(n):

    err=''

    for z in n:

        if type(z)==list:

            x=Validate(z)

            if x!='':

                err='%s%s, ' % (err,x)

        else:

            if 'err' in z:

                print ('...found err:',z)

                err='%s%s, ' % (err,z)

    return err


testpar=['test','err1','err2', ['suberr1','subb'],'isok' ,'lasterr']

print ("Result:",Validate(testpar))

预期结果是:


err1, err2, suberr1, lasterr,

但我得到:


err1, err2, suberr1, , lasterr,


largeQ
浏览 89回答 1
1回答

哆啦的时光机

在第一次检查中,去掉 中的逗号和空格err:for z in n:    if type(z)==list:        x=Validate(z)        if x!='':            err='%s%s' % (err,x) # instead of: err='%s%s, ' % (err,x)# this will print "Result: err1, err2, suberr1, lasterr, "对于您的问题,一个可能更Pythonic(或至少更通用)的解决方案可能是编写一个生成器来遍历嵌套列表:def traverse(o, tree_types=(list, tuple)):    if isinstance(o, tree_types):        for value in o:            for subvalue in traverse(value, tree_types):                yield subvalue    else:        yield o然后您可以使用它根据您的条件检查每个元素:>>> a = [n if 'err' in n else '' for n in traverse(testpar)]['', 'err1', 'err2', 'suberr1', '', '', 'lasterr']>>> print(", ".join(filter(len,a))) # remove empty strings, convert list to prettier string'err1, err2, suberr1, lasterr'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python