2013-01-25 8 views
13

Pythonライブラリを知っている人は、任意のレベルにネストされたオブジェクトを簡単かつ迅速にフィードできます。 this gistには何が見つかり、実行可能なツリーグラフファイルが吐き出されますか?ネストされたPythonオブジェクト(dicts)からツリーグラフを作成するためのPythonライブラリ

私は技術的に心配していない人と仕事ができなければならないので、ここではシンプルさが重要です。私は、「グラフの木」の意味は何

は、私はそれを値のネストされた辞書を養うことができ、それは、ツリー構造を作成し、次の線に沿って何か、次のとおりです。

http://dhaka.rubyforge.org/parse_tree.jpg

+0

「ツリーグラフファイル」とは何ですか?入力/出力の例と、出力の使い方に関するコメントが大いに役立ちます。 – neirbowj

+0

@neirbowj良いコメント、ありがとうございます。 – jdotjdot

答えて

3

この回答の私のコードスニペットで推奨するライブラリは、ではありません。 pythonライブラリですが、このライブラリを使用しているコードをPythonに挿入することができます。モジュールを処理するためにこの外国語のコードは、両方の端にある現存のPythonコード、すなわち入力と出力の両方に接続します。もちろん、わかりませんが、それは実際には "pythonライブラリ"基準。したがって、Webアプリケーションを作成する場合、このコードはクライアント側になります。言い換えれば、このライブラリはPythonではありませんが、Pythonで動作します。

  1. その入力は、(ほぼ)生Pythonのdicts JSON配列またはオブジェクトを返す、より具体的には、json.load(a_python_dict)、ジャバスクリプトライブラリこれは当然認識できるフォーマット。そして、いくつかの 言語固有の形式で

  2. 出力形式はHTMLまたはSVGのどちらかではなく、オブジェクト

あなたはd3.jsを使用することができます。それは木をレンダリングするための、具体的classを持っています

var tree = d3.layout.tree().size([h, w]); 

例フォルダの樹木の例をいくつ(作業コード)はダウンロードフォームでは/あなたが複製することができD3ソースでもありますリンクiは上記のとおりです。

d3はjavascriptライブラリであるため、そのネイティブデータフォーマットはJSONです。

基本的な構造は、ネストされた辞書である、二つの値を持つ単一のノードを表す各辞書は、(アレイに格納されている)ノードの名前とその子は、名それぞれ子供にキーイング:

{"name": "a_root_node", "children": ["B", "C"]} 

そしてもちろん、それはPythonの辞書やJSONとの間で変換するのは簡単です:

>>> d = {"name": 'A', "children": ['B', 'C']} 
>>> import json as JSON 
>>> dj = JSON.dumps(d) 
>>> dj 
    '{"name": "A", "children": ["B", "C"]}' 

ここでiは、上記のようにJSONに変換し、次にツリーは以下の図に示すようにD3でレンダリング大きなツリー(ダース程度ノード)のパイソン辞書表現は次のとおり

tree = {'name': 'root', 'children': [{'name': 'node 2', 'children': 
     [{'name': 'node 4', 'children': [{'name': 'node 10', 'size': 7500}, 
     {'name': 'node 11', 'size': 12000}]}, {'name': 'node 5', 'children': 
     [{'name': 'node 12', 'children': [{'name': 'node 16', 'size': 10000}, 
     {'name': 'node 17', 'size': 12000}]}, {'name': 'node 13', 'size': 5000}]}]}, 
     {'name': 'node 3', 'children': [{'name': 'node 6', 'children': 
     [{'name': 'node 14', 'size': 8000}, {'name': 'node 15', 'size': 9000}]}, 
     {'name': 'node 7', 'children': [{'name': 'node 8', 'size': 10000}, 
     {'name': 'node 9', 'size': 12000}]}]}]} 

tree represented as python dictionary rendered in d3:

ノート:d3はブラウザにレンダリングし、上記の画像はブラウザウィンドウのスクリーンショットです。

+8

-1:D3は素晴らしく、すべてですが、Pythonではなく、* Javascript *ツールです。あなたがPythonをコーディングしているなら、それは本当に助けになりません。 –

+0

この回答が大好きです。最後に、私はpythonスクリプトからの出力を表示するきれいな方法を持っています! – Andrew

5

Iこれがあなたの頭にあるものだとは確信していませんが、それが心に浮かぶ最初のことです。

blockdiagは、主にGraphviz(これにはPythonインターフェイスが存在します)と同様のスタンドアロンファイルプロセッサとして使用されることを意図しています。それは、ドロップされた単純な構文で入力としてテキストファイルを受け入れ、出力として画像を生成します。

スタンドアロンのblockdiagスクリプトに入力用にフォーマットされた再帰的なdict構造を出力するか、またはblockdiagパッケージの必要な内部をインポートして出力を直接駆動するシンプルなシムを書くことができます。

これが有望であると思われる場合は、いくつかのサンプルコードを書き上げることができるかどうかを確認します。

EDIT例コード:

def print_blockdiag(tree, parent=None): 
    if not parent: print('blockdiag { orientation = portrait') 
    for key in tree: 
     if parent: print(' {} -> {};'.format(parent, key)) 
     print_blockdiag(tree[key], key) 
    if not parent: print('}') 

この意志出力blockdiagを読むことができるファイル。

-3

あなたが必要なものに応じて、コンテンツを簡単に見るだけで必要な場合は、オンラインツールを使用してください。"Python dict formatter and viewer"は、dictをツリーとしてレンダリングできます。

+1

私はこれを試し、ちょうどhtmlリストを表示します。 –