向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
相关产品推荐
相关产品推荐

