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

使用Networkx时遇Python列表不可哈希错误,求解决方案

解决"unhashable type: 'list'"错误的方案

错误根源

代码中l = list(set(nodes) - set(first_community))这行存在两个关键问题:

  • first_community是存储所有候选社区的二维列表,直接将其转换为集合时,集合的元素是一个个子列表(如[0,1]),而列表属于不可哈希类型,因此触发"unhashable type: 'list'"错误。
  • 逻辑错误:你需要计算的是当前单个社区的补集,而非整个first_community的补集。

核心修正步骤

将生成second_community的循环代码替换为:

second_community = []
for comm in first_community:
    # 针对单个社区计算补集,而非整个候选社区列表
    complement = list(set(nodes) - set(comm))
    second_community.append(complement)

如果习惯用索引循环,也可以写成:

second_community = []
for i in range(len(first_community)):
    l = list(set(nodes) - set(first_community[i]))
    second_community.append(l)

额外逻辑修正(可选但重要)

你的注释标注ratio是"内部边数/外部边数",但当前代码的计算逻辑是(num_intra_edges1[i] + num_intra_edges2[i])/2,这与定义不符,建议修正为:

# 计算ratio时处理外部边为0的情况(避免除以0错误)
if num_inter_edges[i] == 0:
    ratio.append(float('inf'))  # 无穷大代表最优分割
else:
    ratio.append((num_intra_edges1[i] + num_intra_edges2[i]) / num_inter_edges[i])

完整修正后的代码

import networkx as nx
import itertools as it

def brute_communities(G):
    nodes = list(G.nodes())  # 转为列表操作更稳妥
    n = G.number_of_nodes()

    first_community = []
    for i in range(1, int(n/2 + 1)):
        comb = [list(x) for x in it.combinations(nodes, i)]
        first_community.extend(comb) 

    second_community = []
    for comm in first_community:
        complement = list(set(nodes) - set(comm))
        second_community.append(complement)

    # 计算各类边数
    num_intra_edges1 = []
    num_intra_edges2 = []
    num_inter_edges = []
    ratio = []  # ratio = 内部边总数 / 外部边数

    for comm in first_community:
        num_intra_edges1.append(G.subgraph(comm).number_of_edges())
    
    for comm in second_community:
        num_intra_edges2.append(G.subgraph(comm).number_of_edges())
    
    e = G.number_of_edges()

    for i in range(len(first_community)):
        inter = e - num_intra_edges1[i] - num_intra_edges2[i]
        num_inter_edges.append(inter)
        # 计算ratio,处理除以0情况
        if inter == 0:
            ratio.append(float('inf'))
        else:
            ratio.append((num_intra_edges1[i] + num_intra_edges2[i]) / inter)

    max_value = max(ratio)
    max_index = ratio.index(max_value)
    print(f'({first_community[max_index]}), ({second_community[max_index]})')

G = nx.barbell_graph(5,0)
brute_communities(G)

内容的提问来源于stack exchange,提问作者Andyroid Gaming

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 18:20:29