用NetworkX获取k-shell最内层核心节点遇DiGraph无keys属性报错
解决NetworkX中k-shell算法处理有向图的AttributeError问题
你遇到的AttributeError: 'DiGraph' object has no attribute 'keys'错误,根源是对nx.k_shell()的返回值理解有误,再加上代码里的变量名错误,具体问题和修正方案如下:
错误原因
- 变量名大小写错误:创建的图对象是
G,但调用k_shell时误写为g,导致传入错误对象(若g未定义还会触发NameError) - 返回值误解:
nx.k_shell(G)默认返回的是最大k值对应的k-shell子图(一个DiGraph对象),而非节点与k值对应的字典,因此调用.keys()会报错 - 变量名不一致:代码中将结果赋值给
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
相关产品推荐
相关产品推荐

