2013-07-04 11 views
2

В приложении python мы имеем дерево, состоящее из TreeNode объектов, и нам нужно было добавить свойство в класс TreeNode, который возвращает путь от корня дерева к этому узлу как список. Мы реализовали это простым рекурсивным способом, однако код выглядит немного подробным для python (мы подозреваем, что существует способ перебора выражения простого алгоритма, подобного этому в python). Кто-нибудь знает больше pythonic способ выразить это?Путь дерева от корня к выделенному узлу - путь Pythonic

Вот упрощенная версия нашего кода - это определение path_from_root мы хотим, чтобы улучшить:

class TreeNode(object): 

    def __init__(self, value, parent=None): 
     self.value = value 
     self.parent = parent 

    @property 
    def path_from_root(self): 
     path = [] 
     _build_path_from_root(self, path) 
     return path 


def _build_path_from_root(node, path): 
    if node.parent: 
     _build_path_from_root(node.parent, path) 
    path.append(node) 

Ниже приведены некоторые модульные тесты, которые показывают, как path_from_root работы:

class TreePathAsListTests(unittest.TestCase): 

    def setUp(self): 
     self.root = TreeNode(value="root") 
     self.child_1 = TreeNode(value="child 1", parent=self.root) 
     self.child_2 = TreeNode(value="child 2", parent=self.root) 
     self.leaf_1a = TreeNode(value="leaf 1a", parent=self.child_1) 

    def test_path_from_root(self): 
     self.assertEquals([self.root, self.child_1, self.leaf_1a], self.leaf_1a.path_from_root) 
     self.assertEquals([self.root, self.child_2], self.child_2.path_from_root) 
     self.assertEquals([self.root], self.root.path_from_root) 

Обновление: Принят ответ, который был явным улучшением, но определенно все еще интересуется любыми другими способами выражения этого.

ответ

1

Я хотел бы сделать это следующим образом: (! Это определенно улучшение на то, что у нас есть)

@property 
def path_from_root(self): 
    if self.parent: 
     return self.parent.path_from_root + [self] 
    return [self] 
+0

мне нравится – robjohncox

+0

Не могли бы вы проверить ответ, пожалуйста? –

+0

Просто ожидая, если кто-нибудь предложит какие-либо другие подходы – robjohncox

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