Python ライブラリ treelib を使うと簡単にツリー構造を表現できる.今まで使ったことがなくて,ドキュメントを見ながら基本的な操作を試してみた🌴
ちなみに treelib は「AWS コンピュータービジョン開発の教科書」を読んでいたら,Amazon Rekognition のラベル検出結果をツリー構造で表示するために使われていて,本のトピックと直接は関係ないけど「こんなのあるんだ〜💡」と気になってしまった \( 'ω')/
サンプル
今回はサンプルとして以下のようなツリー構造を 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 コマンド風の」ディレクトリ構造をウェブサイトで簡単に生成できて便利❗️