Python igraph中如何从字典调用不同边权重计算节点距离?
igraph多权重边计算距离报错解决
问题场景
使用igraph计算节点间距离时,单一权重场景运行正常:
nxG = nx.MultiDiGraph() nxG.add_weighted_edges_from(edges) g = ig.Graph.from_networkx(nxG) g.distances(source=nodes, weights='weight')[0]
但给边添加多权重字典(如{'weight': 1, 'weight2': 5, 'weight3': 10})后,虽然能直接访问单条边的weight2值(print(g.es['weight'][0]['weight2'])输出5),但调用distances方法时传入该值会报错:
g.distances(source=nodes, weights=g.es['weight'][0]['weight2'])
错误信息:
TypeError: unhandled type
问题原因
g.es['weight'][0]['weight2']仅返回单条边的权重值,而distances方法的weights参数需要接收所有边的权重序列(要么是边属性名,要么是长度等于边数的数值列表)。
解决方法
方法1:直接使用边属性名
确保NetworkX图转换时保留所有边属性,直接传入属性名即可:
# edges为包含多属性的边列表,格式示例:(u, v, {'weight':1, 'weight2':5}) nxG = nx.MultiDiGraph() nxG.add_edges_from(edges) # 用add_edges_from保留所有属性,而非仅weight的add_weighted_edges_from g = ig.Graph.from_networkx(nxG) # 直接传入属性名'weight2' result = g.distances(source=nodes, weights='weight2')[0]
方法2:手动提取全边权重列表
如果边属性以嵌套字典形式存储,提取所有边的weight2值组成列表传入:
# 提取每条边的weight2值,生成权重列表 weight2_list = [edge_dict['weight2'] for edge_dict in g.es['weight']] # 将列表传入weights参数 result = g.distances(source=nodes, weights=weight2_list)[0]
内容的提问来源于stack exchange,提问作者tonydanza123
相关产品推荐
相关产品推荐

