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

将含重叠键的嵌套字典转换为NetworkX带权有向网络遇阻

解决带权有向网络构建及DataFrame生成问题

问题根源分析

  • 字典赋值覆盖:原循环中每次遍历子节点时,都通过dNotFinalAfterAll[x]={item:forthelasttime.count(item)}直接赋值,会完全覆盖之前的键值对,最终只保留最后一次循环的结果。
  • 重复低效计数:用list.count(item)在循环内反复统计,既浪费性能,又会输出大量重复条目。

修复与实现步骤

1. 高效统计节点权重

借助collections.Counter一次性统计每个主节点对应子节点的出现频次,避免重复计算和数据覆盖。

2. 构建完整权重字典

将统计结果整理为{主节点: {子节点: 权重}}的格式,确保所有边的权重信息被完整保留。

3. 生成带权有向图

基于整理好的权重字典批量添加边,解决单一边输出的问题。

4. 转换为结构化DataFrame

从图的边数据中提取信息,生成可用于后续分析的DataFrame。

完整代码实现

import networkx as nx
from collections import Counter
import pandas as pd

compiledDict = {'A': ['A_1', 'A_2', 'A_3', 'A_4', 'A_5', 'A_6'], 
                'B': ['B_1', 'B_2', 'B_3', 'B_2', 'B_4', 'B_5', 'B_1', 'B_6', 'B_4']}

# 统计每个主节点对应的子节点权重
weight_dict = {}
for main_node, sub_nodes in compiledDict.items():
    sub_counts = Counter(sub_nodes)
    weight_dict[main_node] = sub_counts

# 构建带权有向图
G2 = nx.DiGraph()
for main_node, sub_weights in weight_dict.items():
    for sub_node, weight in sub_weights.items():
        G2.add_edge(main_node, sub_node, weight=weight)

# 验证边信息
print("带权边列表:")
for s, t, w in G2.edges(data=True):
    print(f"{s} -> {t}, 权重: {w['weight']}")

# 转换为DataFrame
edge_records = []
for s, t, w in G2.edges(data=True):
    edge_records.append({
        '源节点': s,
        '目标节点': t,
        '权重': w['weight']
    })
edge_df = pd.DataFrame(edge_records)
print("\n生成的DataFrame:")
print(edge_df)

输出说明

  • 带权边列表会输出所有正确的边及对应权重,例如B -> B_1, 权重: 2、A -> A_1, 权重: 1等,无重复或缺失。
  • DataFrame以表格形式展示源节点、目标节点、权重三列,结构清晰,支持后续数据分析或可视化操作。

内容的提问来源于stack exchange,提问作者William Ashlin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:52:23