如何修复NetworkX中'DegreeView'对象无'values'属性的AttributeError?
错误原因与解决方法
错误根源
NetworkX中G.degree()返回的DegreeView对象是迭代器结构,每个元素是(节点ID, 节点度数)的元组,它并没有values()方法——这就是触发AttributeError的直接原因。旧版NetworkX可能返回字典,因此旧代码的.values()写法在新版本中失效。
修复后的代码
直接从DegreeView中提取度数值即可,优化后的代码如下:
import networkx as nx def graph_identification(): methods = [] for G in P1_Graphs: # 提取所有节点的度数到列表 degree_list = [d for n, d in G.degree()] # 获取去重并排序的度数取值 degree_values = sorted(set(degree_list)) # 计算度数分布占比(直接用列表统计更高效) node_count = nx.number_of_nodes(G) degree_hist = [degree_list.count(i) / node_count for i in degree_values] clustering = nx.average_clustering(G) shortest_path = nx.average_shortest_path_length(G) if len(degree_hist) > 10: methods.append('PA') elif clustering < 0.1: methods.append('SW_H') else: methods.append('SW_L') return methods graph_identification()
关键修改点
- 用列表推导式
[d for n, d in G.degree()]直接提取所有节点的度数,避免重复遍历DegreeView - 提前计算
node_count,避免重复调用nx.number_of_nodes(G)提升效率 - 移除错误的
.values()调用,改用直接操作度数列表的方式
内容的提问来源于stack exchange,提问作者Augustine
相关产品推荐
相关产品推荐

