2

在 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)

更新:接受了一个明显改进的答案,但绝对仍然对任何其他表达方式感兴趣。

4

1 回答 1

1

我会这样做:

@property
def path_from_root(self):
    if self.parent:
        return self.parent.path_from_root + [self]
    return [self]
于 2013-07-04T11:47:50.193 回答