Рекурсивная функция для печати дерева решений в Python: подавить 'None's - PullRequest
1 голос
/ 06 декабря 2011

Я деревья решений реализованы в Python в качестве словарей.Пример:

sampletree = {'spl':'foo', 'go_r':{'cut':150} ,  'l':{'val':100}, 'r':{'val':200}}

У меня есть рекурсивная функция, которая печатает дерево:

def TREE_PRINT(tree, indent=''):
    #is this a leaf node?
    if 'val' in tree:
        print str(tree['val'])
    else:
        #print the criteria
        print 'split: '+ str(tree['spl']) + ' ' + str(tree['go_r'])
        #print the branches
        print indent+'L->', TREE_PRINT(tree['l'], indent+'  ')
        print indent+'R->', TREE_PRINT(tree['r'], indent+'  ')

Как подавить None, которые печатаются при запуске функции?

TREE_PRINT(sampletree)
split: foo {'cut': 150}
L-> 100
None
R-> 200
None

Я попытался вернуть '', но затем я получил лишние разрывы строк.Я строю функцию printtree со страницы 151 в Программировании коллективного разума.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Возвращаемым значением вашей функции является None.Не печатайте возвращаемое значение вашей функции - просто вызовите ее.

def TREE_PRINT(tree, indent=''):
    #is this a leaf node?
    if 'val' in tree:
        print str(tree['val'])
    else:
        #print the criteria
        print 'split: '+ str(tree['spl']) + ' ' + str(tree['go_r'])
        #print the branches
        print indent+'L->',
        TREE_PRINT(tree['l'], indent+'  ')

        print indent+'R->',
        TREE_PRINT(tree['r'], indent+'  ')

Результат

split: foo {'cut': 150}
L-> 100
R-> 200

Посмотрите, как он работает в режиме онлайн: ideone

1 голос
/ 06 декабря 2011

Вам необходимо решить, печатать ли TREE_PRINT строковое представление или возвращать его.Если вы имеете в виду, что он должен печатать данные, то ваш код должен быть таким:

def TREE_PRINT(tree, indent=''):
    #is this a leaf node?
    if 'val' in tree:
        print str(tree['val'])
    else:
        #print the criteria
        print 'split: '+ str(tree['spl']) + ' ' + str(tree['go_r'])
        #print the branches
        print indent+'L->',
        TREE_PRINT(tree['l'], indent+'  ')
        print indent+'R->',
        TREE_PRINT(tree['r'], indent+'  ')
...