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,
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'
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.