来自包含列表的嵌套字典的 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()
问题
给定以下字典作为输入:
{'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()