kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Python でツリー構造を表現できる treelib

Python ライブラリ treelib を使うと簡単にツリー構造を表現できる.今まで使ったことがなくて,ドキュメントを見ながら基本的な操作を試してみた🌴

treelib.readthedocs.io

github.com

ちなみに treelib は「AWS コンピュータービジョン開発の教科書」を読んでいたら,Amazon Rekognition のラベル検出結果をツリー構造で表示するために使われていて,本のトピックと直接は関係ないけど「こんなのあるんだ〜💡」と気になってしまった \( 'ω')/

kakakakakku.hatenablog.com

サンプル

今回はサンプルとして以下のようなツリー構造を treelib で作って,気になった操作を試してみる❗️サポートされてる全ての操作はドキュメント参照📝

root
├── A01
│   └── A11
├── B01
│   ├── B11
│   └── B12
│       ├── B121
│       └── B122
└── C01
    ├── C11
    ├── C12
    └── C13

ツリー構造を作る

以下のように Tree()create_node() でツリー構造を簡単に表現できる.子ノードを作るときは create_node()parent を指定すれば OK👌

from treelib import Tree

tree = Tree()

root = tree.create_node('root')
a01 = tree.create_node('A01', parent=root)
a11 = tree.create_node('A11', parent=a01)
b01 = tree.create_node('B01', parent=root)
b11 = tree.create_node('B11', parent=b01)
b12 = tree.create_node('B12', parent=b01)
b121= tree.create_node('B121', parent=b12)
b122= tree.create_node('B122', parent=b12)
c01 = tree.create_node('C01', parent=root)
c11 = tree.create_node('C11', parent=c01)
c12 = tree.create_node('C12', parent=c01)
c13 = tree.create_node('C13', parent=c01)

表示する

show() を使えばツリー構造をそのまま表示できる.

# root
# ├── A01
# │   └── A11
# ├── B01
# │   ├── B11
# │   └── B12
# │       ├── B121
# │       └── B122
# └── C01
#     ├── C11
#     ├── C12
#     └── C13
print(tree.show(stdout=False))

JSON に変換する

to_json() を使えばツリー構造を JSON に変換して表示できる.

# {"root": {"children": [{"A01": {"children": ["A11"]}}, {"B01": {"children": ["B11", {"B12": {"children": ["B121", "B122"]}}]}}, {"C01": {"children": ["C11", "C12", "C13"]}}]}}
print(tree.to_json())

JSON をフォーマットすると以下のようになる💡

{
    "root": {
        "children": [
            {
                "A01": {
                    "children": [
                        "A11"
                    ]
                }
            },
            {
                "B01": {
                    "children": [
                        "B11",
                        {
                            "B12": {
                                "children": [
                                    "B121",
                                    "B122"
                                ]
                            }
                        }
                    ]
                }
            },
            {
                "C01": {
                    "children": [
                        "C11",
                        "C12",
                        "C13"
                    ]
                }
            }
        ]
    }
}

Graphviz に変換する

to_graphviz() を使えば .dot ファイルに変換できる.

tree.to_graphviz('tree.dot')

ファイルに出力する

save2file() を使えばツリー構造をそのままファイルに出力できる.

tree.save2file('tree.txt')

深さを確認する

depth() を使えばツリー構造の深さを確認できる.

# 3
print(tree.depth())

子ノードを取得する

children() を使えば子ノードのリストを取得できる.

# node.tag='B121' node.identifier='cc4caccc-023e-11ef-bdee-5a033878925f'
# node.tag='B122' node.identifier='cc4cacfe-023e-11ef-bdee-5a033878925f'
b12_children = tree.children(b12.identifier)
for node in b12_children:
    print(f'{node.tag=} {node.identifier=}')

部分木を取得する

subtree() を使えば部分木を取得できる.

# B01
# ├── B11
# └── B12
#     ├── B121
#     └── B122
subtree_b01 = tree.subtree(b01.identifier)
print(subtree_b01.show(stdout=False))

ノードを削除する

remove_node() を使えばツリー構造からノードを削除できる.

# root
# ├── A01
# │   └── A11
# └── B01
#     ├── B11
#     └── B12
#         ├── B121
#         └── B122
tree.remove_node(c01.identifier)
print(tree.show(stdout=False))

関連記事

tree.nathanfriend.io を使うと「tree コマンド風の」ディレクトリ構造をウェブサイトで簡単に生成できて便利❗️

kakakakakku.hatenablog.com