Python嵌套字典展开及NetworkX图构建技术问询
解决嵌套字典展开并构建NetworkX图的问题
没问题,我来一步步帮你搞定这个需求——先把嵌套字典转换成你要的扁平列表,再用它构建NetworkX图。
第一步:展开嵌套字典为目标格式列表
你的嵌套字典结构是「起始节点: [ {目标节点: 权重}, ... ]」,我们需要把它转换成「起始节点 目标节点 权重」依次排列的扁平列表。如果是要构建无向图(避免重复边),可以只保留起始节点 < 目标节点的条目,这样就和你给出的示例结果一致了。
代码实现
data_dict = {0: [{1: 2}, {2: 3}, {3: 6}, {7: 8}], 1: [{0: 2}, {4: 7}, {2: 5}], 2: [{0: 3}, {1: 5}, {5: 4}, {11: 5}], 3: [{0: 6}, {6: 2}, {11: 4}], 4: [{1: 7}], 5: [{2: 4}, {8: 3}], 6: [{3: 2}, {9: 3}], 7: [{0: 8}], 8: [{5: 3}], 9: [{6: 3}, {10: 6}], 10: [{9: 6}], 11: [{2: 5}, {3: 4}]} # 展开为目标列表(无向图去重) flattened_list = [] for u, adj_list in data_dict.items(): for edge_dict in adj_list: v, w = next(iter(edge_dict.items())) # 只保留u < v的边,避免无向图重复 if u < v: flattened_list.extend([u, v, w]) # 输出你要的字符串格式 print(' '.join(map(str, flattened_list)))
运行这段代码,输出的结果就是你指定的:
0 1 2 0 2 3 0 3 6 0 7 8 1 2 5 1 4 7 2 5 4 2 11 5 3 6 2 3 11 4 5 8 3 6 9 3 9 10 6
如果是要构建有向图(保留所有方向的边),只需要去掉if u < v:的判断即可。
第二步:用展开后的结果构建NetworkX图
NetworkX提供了add_weighted_edges_from方法,可以直接接受(起始节点, 目标节点, 权重)的元组列表,这比先转成扁平列表再处理更高效。我们可以在遍历字典的时候直接构建这个元组列表:
代码实现
import networkx as nx data_dict = {0: [{1: 2}, {2: 3}, {3: 6}, {7: 8}], 1: [{0: 2}, {4: 7}, {2: 5}], 2: [{0: 3}, {1: 5}, {5: 4}, {11: 5}], 3: [{0: 6}, {6: 2}, {11: 4}], 4: [{1: 7}], 5: [{2: 4}, {8: 3}], 6: [{3: 2}, {9: 3}], 7: [{0: 8}], 8: [{5: 3}], 9: [{6: 3}, {10: 6}], 10: [{9: 6}], 11: [{2: 5}, {3: 4}]} # 构建带权重的边元组列表(无向图去重) weighted_edges = [] seen_edges = set() for u, adj_list in data_dict.items(): for edge_dict in adj_list: v, w = next(iter(edge_dict.items())) # 记录已添加的边,避免无向图重复 edge_pair = tuple(sorted((u, v))) if edge_pair not in seen_edges: weighted_edges.append((u, v, w)) seen_edges.add(edge_pair) # 创建无向图并添加边 G = nx.Graph() G.add_weighted_edges_from(weighted_edges) # 验证图的边(包含权重信息) print("图的边及权重:") for edge in G.edges(data=True): print(edge)
如果要构建有向图,只需要把nx.Graph()换成nx.DiGraph(),并且去掉去重逻辑,直接添加所有边即可:
# 构建有向图的边列表 weighted_edges = [] for u, adj_list in data_dict.items(): for edge_dict in adj_list: v, w = next(iter(edge_dict.items())) weighted_edges.append((u, v, w)) # 创建有向图 G = nx.DiGraph() G.add_weighted_edges_from(weighted_edges)
这样就完成了从嵌套字典到NetworkX图的整个流程啦!
内容的提问来源于stack exchange,提问作者Akosua Biggles
相关产品推荐
相关产品推荐

