Python 嵌套字典到 Tree

问题描述 投票:0回答:1

我正在尝试将嵌套字典显示为树。

data = {"L1" : 
            {"sub L1" : 
                "sub sub L1"}, 
        "L2" :
            "sub L2", 
        "L3" :
            {"sub L3" :
                {"sub sub L3" :
                    "sub sub sub L3"}}}

正如您所看到的,它都是文本数据,并且它们之间没有真正的相关性。

我尝试过networkx和树状图,但它们似乎打破了,因为我有一个嵌套字典。

有更好的方法吗?

python dictionary plot tree
1个回答
0
投票

您需要将数据解包到一系列节点链中。 然后您可以将它们按顺序添加到图表中。

data = {'L1': {'sub L1': 'sub sub L1'},
 'L2': 'sub L2',
 'L3': {'sub L3': {'sub sub L3': 'sub sub sub L3'}}}

def unpack(d, is_root=True):
    if is_root:
        root = []
    r = []
    for k, v in d.items():
        if is_root:
            r = []
            root.append(r)
        r.append(k)
        if isinstance(v, dict):
            r.extend(unpack(v, False))
        else:
            r.append(v)
    return root if is_root else r

node_lists = unpack(data)
node_lists
# returns:
[['L1', 'sub L1', 'sub sub L1'],
 ['L2', 'sub L2'],
 ['L3', 'sub L3', 'sub sub L3', 'sub sub sub L3']]

用于绘图:

g = networkx.DiGraph()
for node_chain in node_lists:
    for a, b in zip(['root'] + node_chain, node_chain):
        g.add_edge(a, b)

pos = networkx.nx_pydot.graphviz_layout(g)
networkx.draw_networkx(g, pos)
networkx.draw_networkx_labels(g, pos)
© www.soinside.com 2019 - 2024. All rights reserved.