14

たとえば、この要点で見つけたものに沿ったdictツリーのように、任意のレベルにネストされたオブジェクトを簡単かつ迅速にフィードできるPythonライブラリを知っている人はいますか?実行可能なツリーを吐き出すことができますグラフファイル?

ここでは、技術的に気にしない人と一緒に仕事ができなければならないので、シンプルさが鍵となります。

「グラフツリー」とは、次のようなものです。ネストされた値のディクショナリをフィードすると、ツリー構造が作成されます。


(出典:rubyforge.org

4

5 に答える 5

5

これがあなたが考えていることであるかどうかはわかりませんが、最初に頭に浮かぶのはそれです。

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が読み取れるファイルが出力されます。

于 2013-01-25T17:50:16.910 に答える
2

したがって、この回答のコードスニペットに推奨して使用するライブラリはPythonライブラリではありませんが、Pythonに適したライブラリです。つまり、このライブラリを使用するコードをPythonモジュールに挿入して、データを処理することができます。外国のコードは、両端、つまり入力と出力の両方で既存のPythonコードに接続します。もちろん、私にはわかりませんが、「Pythonライブラリ」の基準が実際に意味するのはそれだけだと思います。したがって、Webアプリを作成している場合、このコードはクライアント側になります。つまり、このライブラリはPythonではありませんが、Pythonで動作します。

  1. その入力は(ほぼ)生のpython dictsです。より具体的には、json.load(a_python_dict)はjson配列またはオブジェクトを返します。これは、このjavascriptライブラリがもちろん認識できる形式です。と

  2. 出力形式はHTMLまたはSVGであり、言語固有の形式のオブジェクトではありません

d3.jsを使用できます。ツリーをレンダリングするための特別なクラスがあります。

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

d3ソースのexampleフォルダーには、ツリー(作業コード)の例もいくつかあります。これらは、上記のリンクから複製/ダウンロードできます。

d3はjavascriptライブラリであるため、そのネイティブデータ形式はJSONです。

基本構造はネストされたディクショナリであり、各ディクショナリは、ノードの名前とその子(配列に格納されている)の2つの値を持つ単一のノードを表し、それぞれ名前子にキー設定されています。

{"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"]}'

これは、上記のようにjsonに変換し、d3で下の画像に示すツリーとしてレンダリングした、より大きなツリー(1ダースほどのノード)のPythonディクショナリ表現です。

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}]}]}]}

d3でレンダリングされたPython辞書として表されるツリー:

:d3はブラウザでレンダリングされます; 上の画像は、ブラウザウィンドウのスクリーンショットです。

于 2013-01-25T18:41:36.787 に答える
1

D3.jsは主に視覚化のためのライブラリです...

私の知る限り、グラフをトラバースしたり、グラフを操作したりするための便利なツールは提供されていません。しかし、それらはPythonnetworkXパッケージに含まれています。

import networkx as nx

graph_data = {
    'id': 'root',
    'children': [
        {
            'id': 'A',
            'children': [
                {
                    'id': 'B', 'children': [{'id': 'B1'}, {'id': 'B2'}]
                },
                {
                    'id': 'C'
                }
            ]
        }
    ]
}

G = nx.readwrite.json_graph.tree_graph(graph_data)

print('EDGES: ', G.edges())
# EDGES: [('root', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B1'), ('B', 'B2')]
print('NODES: ', G.nodes())
# NODES: ['root', 'A', 'B', 'B1', 'B2', 'C']

これは、構造から同一のD3.js(idおよびchildrenフィールドを含む)を作成する例です。

グラフは、再帰を使用して繰り返し作成することも、さまざまな形式で読み取りと書き込みを行うこともできます: https ://networkx.github.io/documentation/stable/reference/readwrite/index.html

于 2020-04-27T07:59:28.970 に答える
0

私は同様の問題を探していました。キー構造が非常に周期的である、ネストされたdictを使用したdictのキーの印刷です。したがって、すべてのdictとネストされたdictのキーを出力する再帰関数を作成しました単一のブランチ用です。

次のコードスニペットが他の人に役立つことを願っています。

from itertools import zip_longest

def dictPrintKeysTopBranch(dic):
    #track recursive depth
    depth=dictPrintKeysTopBranch.data.get('depth',-1)+1;
    dictPrintKeysTopBranch.data['depth']=depth;

    #accumalte keys from nested dicts
    if type(dic) is type(dict()):
        listKeys=sorted(list(dic.keys()));

        #save keys of current depth
        dictPrintKeysTopBranch.data['listKeysDepth{}'.format(depth)]=listKeys;

        #repeat for top branch
        dictPrintKeysTopBranch(dic[listKeys[0]]);

    #print accumalated list of keys
    else: 
        #pad lists 
        lists=[];
        maxlen=[];
        for d in range(depth):
            l=dictPrintKeysTopBranch.data['listKeysDepth{}'.format(d)];
            lists.append(l);

            lens = [len(s) for s in l];
            maxlen.append(max(lens)+1);

        i=-1;
        for zipped in zip_longest(*lists, fillvalue=' '):
            i=i+1;
            #print(x)
            row = '';
            j=-1;
            for z in zipped:
                j=j+1;
                if i==0:
                    row = row+ ((' {: <'+str(maxlen[j])+'} -->\\').format(z));
                else :
                    row = row+ ((' {: <'+str(maxlen[j])+'}    |').format(z));
            print(row.strip('\\|->'));

    dictPrintKeysTopBranch.data={};
dictPrintKeysTopBranch.data={};

ここに例があります:

mydict = { 'topLv':{'secLv':{'thirdLv':{'item1':42,'item2':'foo'}}}, 
           'topLvItem':[1,2,3], 
           'topLvOther':{'notPrinted':':('}
         }
dictPrintKeysTopBranch(mydict)

出力:

topLv       -->\ secLv  -->\ thirdLv  -->\ item1  
topLvItem      |           |             | item2     
topLvOther     |           |             |         
于 2018-09-25T13:15:47.483 に答える
-2

必要なものにもよりますが、コンテンツを簡単に表示するためだけに必要な場合は、そのためのオンラインツールを使用できます。 「Pythondictフォーマッターとビューアー」はdictをツリーとしてレンダリングできます。

于 2013-04-07T17:02:40.693 に答える