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

向NetworkX有向图添加边与数据时出现TypeError报错求助

问题排查与解决

错误原因

NetworkX 的 DiGraph.add_edge() 方法仅接受2个位置参数(源节点 u 和目标节点 v),后续的边属性必须以关键字参数形式传入,或通过字典拆包(**)传递。你直接将 lnkDict 作为第三个位置参数传入,导致参数数量超出方法预期,触发 TypeError。

解决方法

提供两种可行的修正方案:

方案1:字典拆包传递属性

将属性字典通过 ** 拆包为关键字参数传入,若不需要将 Fnode 和 Tnode 作为边属性,可先过滤掉这两个键:

# 过滤掉节点ID键,仅保留需要的边属性
attr_dict = {k: v for k, v in lnkDict.items() if k not in ["Fnode", "Tnode"]}
Graph.add_edge(int(lnkDict["Fnode"]), int(lnkDict["Tnode"]), **attr_dict)

如果需要保留所有键(包括节点ID),直接拆包即可:

Graph.add_edge(int(lnkDict["Fnode"]), int(lnkDict["Tnode"]), **lnkDict)

方案2:使用 add_edges_from() 方法

add_edges_from() 支持以 (u, v, attr_dict) 格式的元组批量添加边,单个边也可以用此方法:

Graph.add_edges_from([(int(lnkDict["Fnode"]), int(lnkDict["Tnode"]), lnkDict)])

额外提示

你的代码中,循环遍历行时每次都会覆盖 lnkDict 的内容,最终只会添加最后一行数据对应的边。如果需要添加所有行的边,应将 add_edge/add_edges_from 的调用放在循环内部:

Graph = nx.DiGraph()
for row in inSheet.iter_rows():
    lnkDict = collections.OrderedDict()
    attr = 0
    for cell in row[:len(HeaderLst)]:
        lnkDict[HeaderLst[attr]] = cell.value
        attr += 1
    # 在这里添加边
    attr_dict = {k: v for k, v in lnkDict.items() if k not in ["Fnode", "Tnode"]}
    Graph.add_edge(int(lnkDict["Fnode"]), int(lnkDict["Tnode"]), **attr_dict)

内容的提问来源于stack exchange,提问作者Punit Sharnagat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:30:04