用于从嵌套Python对象(dicts)创建树图的Python库

jdo*_*dot 12 python tree dictionary graph

有没有人知道任何Python库,它允许你简单快速地将它嵌套到任意级别的对象,例如沿着你在这个要点中找到的行的dict树,它可以吐出一个可行的树图形文件?

简单是关键,因为我必须能够与那些没有技术头脑的人一起工作.

我所说的"图树"是指下面的内容,我可以在其中提供一个嵌套的值字典,然后它将创建树结构:

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

nei*_*owj 5

我不确定这是你的想法,但这是我想到的第一件事.

blockdiag主要用作类似于Graphviz的独立文件处理器(存在Python接口).它接受一个文本文件作为输入,使用简单的语法,并生成图像作为输出.

您应该能够编写一个简单的填充程序来输出格式化输入到独立的blockdiag脚本的递归dict结构,或者导入blockdiag包的必要内部并直接驱动输出.

如果这看起来很有希望,我会看看是否可以提供一些示例代码.

编辑示例代码:

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('}')
Run Code Online (Sandbox Code Playgroud)

这将输出blockdiag可以读取的文件.


dou*_*oug 3

所以我在这个答案中推荐和用于我的代码片段的库不是一个Python库,但它是一个Python友好的库,我的意思是使用这个库的代码可以插入到一个Python模块中来处理数据,这外部代码将在两端(即输入和输出)连接到现有的 python 代码,我怀疑,尽管我当然不知道,这就是“python 库”标准的真正含义。因此,如果您正在编写网络应用程序,则此代码将位于客户端。换句话说,这个库不是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]);
Run Code Online (Sandbox Code Playgroud)

d3源代码的示例文件夹中还有几个树的示例(工作代码),您可以从我上面提供的链接克隆/下载它们。

因为 d3 是一个 javascript 库,所以它的原生数据格式是JSON

基本结构是一个嵌套字典,每个字典代表一个具有两个值的节点,即节点的名称及其子节点(存储在数组中),分别以名称子节点为键:

{"name": "a_root_node", "children": ["B", "C"]}
Run Code Online (Sandbox Code Playgroud)

当然,Python 字典和 JSON 之间的转换也很简单:

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

这是一个较大的树(十几个左右节点)的 Python字典表示形式,我将其转换为上面的 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}]}]}]}
Run Code Online (Sandbox Code Playgroud)

树表示为在 d3 中渲染的 python 字典:

注意:d3 在浏览器中呈现;上图只是我的浏览器窗口的屏幕截图。

  • -1:D3 很棒,但它是一个 *Javascript* 工具,而不是 Python。如果你正在编写 Python 代码,这并没有什么帮助。 (11认同)