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

用NetworkX获取k-shell最内层核心节点遇DiGraph无keys属性报错

解决NetworkX中k-shell算法处理有向图的AttributeError问题

你遇到的AttributeError: 'DiGraph' object has no attribute 'keys'错误,根源是对nx.k_shell()的返回值理解有误,再加上代码里的变量名错误,具体问题和修正方案如下:

错误原因

  1. 变量名大小写错误:创建的图对象是G,但调用k_shell时误写为g,导致传入错误对象(若g未定义还会触发NameError)
  2. 返回值误解:nx.k_shell(G)默认返回的是最大k值对应的k-shell子图(一个DiGraph对象),而非节点与k值对应的字典,因此调用.keys()会报错
  3. 变量名不一致:代码中将结果赋值给shells,后续却用k_shells引用,属于未定义变量错误

修正方案

方案1:通过core_number获取所有节点的k-shell值并筛选

先计算每个节点的核心数,再找出最高k值对应的节点:

import networkx as nx

# 创建有向图
G = nx.DiGraph()
G.add_edge(1,2,weight=673)  
G.add_edge(2,4,weight=201)  
G.add_edge(4,1,weight=20)  
G.add_edge(2,3,weight=96)  
G.add_edge(3,4,weight=44)  
G.add_edge(6,3,weight=7)  
G.add_edge(6,4,weight=96)  
G.add_edge(5,6,weight=10)  
G.add_edge(7,6,weight=10)  
G.add_edge(8,6,weight=10)  

# 计算每个节点的k-shell核心数
core_numbers = nx.core.core_number(G)

# 找到最大的k-shell值
max_k = max(core_numbers.values())

# 筛选出最内层核心节点
inner_core_nodes = [node for node, k in core_numbers.items() if k == max_k]

print(inner_core_nodes)

方案2:直接用k_shell获取最大k的子图

如果只需要最内层核心节点,可直接调用k_shell(G)获取最大k的子图,再提取节点:

import networkx as nx

# 创建有向图
G = nx.DiGraph()
G.add_edge(1,2,weight=673)  
G.add_edge(2,4,weight=201)  
G.add_edge(4,1,weight=20)  
G.add_edge(2,3,weight=96)  
G.add_edge(3,4,weight=44)  
G.add_edge(6,3,weight=7)  
G.add_edge(6,4,weight=96)  
G.add_edge(5,6,weight=10)  
G.add_edge(7,6,weight=10)  
G.add_edge(8,6,weight=10)  

# 获取最大k值的k-shell子图
max_k_shell_subgraph = nx.core.k_shell(G)
# 提取子图中的节点
inner_core_nodes = list(max_k_shell_subgraph.nodes())

print(inner_core_nodes)

两种方案最终输出的最内层核心节点均为[1, 2, 3, 4]。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:27:22