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

图节点度数计算函数报错: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:35:48