2017-02-16 11 views
3

Я знаю, что pprint может довольно печатать вложенный список или словарь, которые являются обоими типами древовидных структур, но я хочу, чтобы pprint дерево на основе классов с произвольным количеством детей, так что узлы с отступом справа на их уровне в дереве.Как создать структуру данных дерева, которая реализована с использованием классов?

Может ли pprint использовать то, что я хочу, и если да, то как? Я могу написать свою собственную функцию, которая красиво печатает дерево, но я хотел проверить, нужно ли мне это делать.

Рассмотрим следующий пример:

class Tree: 
    def __init__(self, value, *args): 
     self.value = value 
     self.children = args 

tree = Tree("+", Tree(1), Tree("*", Tree(2), Tree(3))) 

Вот мой ожидаемый результат, если бы мы были довольно-печать дерево:

+ 
    1 
    * 
     2 
     3 

Опять же, я могу, конечно, свернуть свою собственную функцию, но Я хочу посмотреть, смогу ли я использовать pprint, если это будет проще, и я просто что-то пропускаю.

pprint documentation не является примером для моего варианта использования.

Если это имеет значение, я использую Python 2.7.

ответ

2

pprint работает с произвольными классами, которые определили свой метод __repr__.

Чтобы получить то, что вы хотите здесь, я думаю, вам нужно будет управлять своим собственным гнездом, после чего вы можете просто использовать print.

def __repr__(self, depth=1): 
    return_string = [str(self.value)] 
    for child in self.children: 
     return_string.extend(["\n", " " * (depth+1), child.__repr__(depth+1)]) 
    return "".join(return_string) 

, а затем pprint(tree) и print tree оба дают вам

+ 
    1 
    * 
    2 
    3 
+1

Спасибо! Кажется, что ошибка документа, что в документации [pprint documentation] (https://docs.python.org/2/library/pprint.html) не упоминается '__repr__'. –

Смежные вопросы