В приложении 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)
Обновление: Принят ответ, который был явным улучшением, но определенно все еще интересуется любыми другими способами выражения этого.
мне нравится – robjohncox
Не могли бы вы проверить ответ, пожалуйста? –
Просто ожидая, если кто-нибудь предложит какие-либо другие подходы – robjohncox