在python应用程序中,我们有一个由TreeNode
个对象组成的树,我们必须在TreeNode
类上添加一个属性,该属性返回从树根到该节点的路径作为列表。我们已经以一种简单的递归方式实现了这一点,但是对于python,代码看起来有点冗长(我们怀疑在python中有一种表达这样简单算法的简单方法)。有没有人知道更多 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)
更新:接受了一个明显改善的答案,但绝对仍然对其他任何表达方式感兴趣。
答案 0 :(得分:1)
我会这样做:
@property
def path_from_root(self):
if self.parent:
return self.parent.path_from_root + [self]
return [self]