Pythonで作成している処理の中でどうしても「Tree(木構造)のデータ」を扱うことが必要になりました。
一から自分で作るのは不具合を生みそうなので何かないかと探したところ「Node, anytree,RenderTree」モジュールを使うことで解決ができそうです。
今回はこの「Node, RenderTree」モジュールの使い方を解説します。
Tree(木構造)のデータを扱うモジュール(Node, anytree, RenderTree)
PythonでTree(木構造)のデータを扱うには「Node, anytree, RenderTree」を使う方法が簡単そうです。
モジュールNodeとanytreeのインストール
まずは「Node」と「anytree」が必要になるのでインストールします。
インストールはpipを使ってできます。
pip install Node pip install anytree
Tree(木構造)の生成
次にNodeを使ってTree(木構造)を生成します。
from anytree import Node, RenderTree udo = Node( "Udo" , parent=None ) marc = Node( "Marc", parent=udo ) lian = Node( "Lian", parent=marc ) dan = Node( "Dan", parent=udo ) jet = Node( "Jet", parent=dan ) jan = Node( "Jan", parent=dan ) joe = Node( "Joe", parent=dan )
基本的には生成するNodeオブジェクトに親のNodeオブジェクトを指定して設定していきます。
(Topだけは「Parent(親)」が存在しないので引数を指定しないか、Noneを与えておきます。)
これで準備完了です。
Tree(木構造)へのアクセス
Tree(木構造)へのアクセスは「RenderTree」を使って行います。
for pre, fill, node in RenderTree(udo): print("%s%s" % (pre, node.name))
上記のプログラムを実行すると
Udo ├── Marc │ └── Lian └── Dan ├── Jet ├── Jan └── Joe
になります。
Nodeへの独自のプロパティ追加
Nodeオブジェクトには独自のプロパティーを追加することができます。
from anytree import Node, RenderTree udo = Node( "Udo" , parent=None, dirtype=1 ) marc = Node( "Marc", parent=udo, dirtype=2 ) lian = Node( "Lian", parent=marc, dirtype=3 ) dan = Node( "Dan", parent=udo, dirtype=1 ) jet = Node( "Jet", parent=dan, dirtype=1 ) jan = Node( "Jan", parent=dan, dirtype=1 ) joe = Node( "Joe", parent=dan, dirtype=1 )
これでNodeにdirtypeというプロパティが設定されました。
プロパティの参照にはちょっと工夫が必要で
for pre, fill, node in RenderTree(udo): print( "name=[{}],depth=[{}],dirtype=[{}]".format( node.name, node.depth, eval("node.dirtype") ))
のように「eval」を使うと上手く参照できるようになります。
実行結果は
name=[Udo],depth=[0],dirtype=[1] name=[Marc],depth=[1],dirtype=[2] name=[Lian],depth=[2],dirtype=[3] name=[Dan],depth=[1],dirtype=[1] name=[Jet],depth=[2],dirtype=[1] name=[Jan],depth=[2],dirtype=[1] name=[Joe],depth=[2],dirtype=[1]
になります。
まとめ
PythonでTree(木構造)のデータを扱うには「Node, anytree, RenderTree」を使う方法が簡単でおすすめです。
以上、PythonでTree(木構造)のデータを扱うモジュール「Node, anytree,RenderTree」でした。