Networkx获取节点邻居时报错unhashable type: 'dict'如何解决
问题诱发原因
该报错核心原因是传入graph.neighbors()方法的参数为不可哈希的字典类型:
networkx的邻接表底层用字典存储,查询邻居时需要传入可哈希的节点ID作为键。你代码里通过random.choice(graphs.nodes())拿到的pos不是合法的节点ID,而是节点属性字典,字典属于不可哈希类型,触发了类型错误。
之所以从graphs.nodes()里取到字典,是因为networkx 2.x及以上版本中,graph.nodes()返回的是NodeView动态视图对象,不是普通列表:如果你的代码此前给节点设置过自定义属性,或者在部分版本实现中,直接迭代NodeView可能会返回包含属性字典的结构,导致随机选到的内容不是纯节点ID。
解决方案
以下两种方案都可以解决该问题:
- 显式指定只取节点ID并转为列表再随机选择
将取节点的代码修改为:# data=False 强制返回纯节点ID,转成list规避NodeView的动态特性 pos = random.choice(list(graphs.nodes(data=False))) - 如果你用的networkx版本默认nodes()返回纯ID,只需要显式转list即可:
pos = random.choice(list(graphs.nodes()))
修改后完整可运行代码示例:
import networkx import random graphs = networkx.erdos_renyi_graph(10, 0.5) pos = random.choice(list(graphs.nodes(data=False))) neighbors = graphs.neighbors(pos) # 可以打印验证邻居 print(list(neighbors))
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

