图节点度数计算函数报错:unhashable type: 'list' 求助
问题分析与修复
错误原因
- degree函数逻辑完全偏离需求:你给
degree函数传入了目标节点参数,但函数内部用for node in graph.items()覆盖了该参数,此时node是键值对元组(如(节点, 邻接列表)),后续执行graph[node]试图用元组作为键访问字典,既不符合“获取指定节点度数”的需求,也会引发键类型不匹配的问题。 - graph类型定义矛盾:你定义
graph = defaultdict(dict)(默认值为字典),但在addEdge里手动把值改成了列表,导致defaultdict的自动初始化逻辑失效,访问未创建的节点时会生成空字典而非空列表,易引发后续错误。 - 潜在节点类型错误:如果调用
addEdge时传入列表作为节点(如addEdge([1], [2])),列表作为不可哈希类型无法作为字典的键,会直接触发unhashable type: 'list'错误。
修复后的代码
from collections import defaultdict # 改用defaultdict(list),自动为不存在的键创建空列表,匹配邻接列表的需求 graph = defaultdict(list) def addEdge(node1, node2): # 无需手动判断节点是否存在,defaultdict会自动处理初始化 graph[node1].append(node2) graph[node2].append(node1) def degree(node): # 直接返回指定节点的邻接列表长度,节点不存在时返回0避免KeyError return len(graph.get(node, [])) def select(): # 用列表推导式简化代码,遍历所有节点获取度数 weights = [degree(node) for node in graph] return weights
关键说明
degree函数直接使用传入的node参数,通过graph.get(node, [])安全获取邻接列表,取长度即为节点度数。- 改用
defaultdict(list)后,addEdge无需手动初始化节点的列表,代码更简洁可靠。 - 确保调用
addEdge时传入的节点是可哈希类型(如字符串、数字、元组),禁止用列表作为节点标识。
内容的提问来源于stack exchange,提问作者slacks37
相关产品推荐
相关产品推荐

