0

I have trouble pointing out what I do wrong in recursion subroutines.

The routine is:

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))

The expected result is:

err1, err2, suberr1, lasterr,

but I get:

err1, err2, suberr1, , lasterr,
khelwood
  • 55,782
  • 14
  • 81
  • 108
eSlavko
  • 348
  • 3
  • 12

1 Answers1

0

In your first check, get rid of the comma and whitespace in 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, "

A maybe more pythonic (or at least more general) solution to your problem could be to write a generator to traverse a nested list:

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

which you can then use to check each element against your condition:

>>> 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'
runDOSrun
  • 10,359
  • 7
  • 47
  • 57