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

在Jupyter中运行NetworkX代码时遇两类错误求助

解决NetworkX代码中的两个常见错误

我来帮你逐个拆解这两个错误,结合你给出的代码片段来分析可能的问题和解决办法:

1. "unhashable type: 'dict'" 错误

这个错误的核心原因是NetworkX要求节点必须是可哈希的数据类型,但你不小心把字典当成节点传入了。

看你定义节点的方式:

a = [ ( 'a_%d' % i, {'a' : i}) for i in range(0,5) ]

这种(节点名称, 属性字典)的二元组格式是完全正确的,符合NetworkX添加节点的要求。那问题大概率出在你添加节点的操作上:

  • 比如你可能误写了G.add_node(a[0]),而不是G.add_nodes_from(a)——前者会把('a_0', {'a':0})这个元组里的每个元素单独当成节点,也就是把字典{'a':0}作为节点,自然触发"unhashable type"错误。
  • 或者你在其他地方不小心把字典直接传给了add_node()或add_nodes_from()。

解决办法:

  • 确认所有添加节点的代码都是用G.add_nodes_from(节点列表)的方式,节点列表里的每个元素是(节点名, 属性字典)的二元组;
  • 避免把字典、列表这类不可哈希的类型直接作为节点使用,节点名尽量用字符串、数字这类简单可哈希的类型。

2. "ValueError: too many values to unpack (expected 2)" 错误

这个错误通常是迭代元素时,元素的长度和你要解构的变量数量不匹配,在NetworkX里常见于处理边或节点的场景:

常见场景1:处理边时出错

NetworkX的add_edges_from()要求每个边元素是以下两种格式之一:

  • (源节点, 目标节点)
  • (源节点, 目标节点, 属性字典)

如果你定义的边列表里有元素长度超过3(比如('a_0', 'b_0', {'weight':1}, '额外参数')),或者你在遍历边时写了for u, v in G.edges(data=True):——edges(data=True)返回的是(u, v, 属性字典)的三元组,强行解构为两个变量就会触发这个错误。

常见场景2:处理节点时出错

如果你遍历节点时写了for node, attr, extra in G.nodes(data=True):,但nodes(data=True)返回的是(节点名, 属性字典)的二元组,解构为三个变量自然会报错。

解决办法:

  • 检查边列表的每个元素格式,确保最多包含3个值(源、目标、属性);
  • 遍历节点/边时,匹配解构变量的数量:
    • 遍历节点带属性:for node, attr in G.nodes(data=True):
    • 遍历边带属性:for u, v, attr in G.edges(data=True):
    • 不带属性的话,直接用for node in G.nodes()或for u, v in G.edges()。

正确示例代码

给你补全并修正后的完整代码参考:

import pandas as pd
import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import os, warnings
warnings.filterwarnings('ignore')
%matplotlib inline
%config InlineBackend.figure_format = 'retina'

# 定义节点列表(你的原有代码是对的)
a = [ ( 'a_%d' % i, {'a' : i}) for i in range(0,5) ]
b = [ ( 'b_%d' % i, {'b' : i}) for i in range(0,5) ]
c = [ ( 'c_%d' % i, {'c' : i}) for i in range(0,5) ]

# 创建图对象
G = nx.Graph()

# 正确添加节点
G.add_nodes_from(a)
G.add_nodes_from(b)
G.add_nodes_from(c)

# 定义边列表(示例)
edges = []
for i in range(5):
    # 带属性的边
    edges.append(('a_%d' % i, 'b_%d' % i, {'weight': i+1}))
    # 不带属性的边
    edges.append(('b_%d' % i, 'c_%d' % i))

# 正确添加边
G.add_edges_from(edges)

# 验证节点和边
print("节点列表(带属性):")
for node, attr in G.nodes(data=True):
    print(f"{node}: {attr}")

print("\n边列表(带属性):")
for u, v, attr in G.edges(data=True):
    print(f"{u} -> {v}: {attr}")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 02:24:11