来自包含列表的嵌套字典的 Networkx 图

Networkx graph from nested dict containing lists

问题

给定以下字典作为输入:

{'apple': [{'colours': ['red', 'yellow', 'green']}, {'type': ['granny smith']}, {'price': ['0.10']}]}

如何使用 networkx 创建具有以下边的图形:

我尝试了什么?

我可以创建一个简单的图形但不包含所有边:

g = nx.Graph(d["apple"][0])

使用递归函数非常简单,因为您的数据结构始终具有到列表的键映射,并且列表中的每个项目都是另一个字典(您可以在其上递归)或叶节点。

#!/usr/bin/env python
import matplotlib.pyplot as plt
import networkx as nx

from netgraph import Graph # pip install netgraph

def parse(data):
    edges = []
    if isinstance(data, dict):
        for key, items in data.items():
            for item in items:
                if isinstance(item, dict):
                    edges.extend([(key, subitem) for subitem in item])
                    edges.extend(parse(item))
                else:
                    edges.append((key, item))
    return edges


if __name__ == '__main__':

    sample_data = {'apple': [{'colours': ['red', 'yellow', 'green']}, {'type': ['granny smith']}, {'price': ['0.10']}]}
    edges = parse(sample_data)
    g = nx.from_edgelist(edges, create_using=nx.DiGraph)
    Graph(g, node_layout='dot', node_labels=True, node_label_fontdict=dict(size=20),
          edge_color='black', edge_alpha=1., edge_width=0.1, node_edge_width=0.)
    plt.show()