2

Python アプリケーションでは、TreeNodeオブジェクトで構成されたツリーがTreeNodeあり、ツリーのルートからそのノードへのパスをリストとして返すプロパティをクラスに追加する必要がありました。これを単純な再帰的な方法で実装しましたが、コードは Python では少し冗長に見えます (Python でこのような単純なアルゴリズムを表現するより簡潔な方法があると思われます)。これを表現するよりPython的な方法を知っている人はいますか?

これは私たちのコードの簡略化されたバージョンです - これは私たち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 に答える