使用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
相关产品推荐
相关产品推荐

