You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:31:18