如何在Python中生成包含边权的图邻接表?
如何从边文件生成带权邻接表(Python)
嘿,我明白你的需求了——你现在的代码只能生成不带权的邻接表,而且还没处理到一行里的多个边(看你的示例输入一行有好几条边对吧?)。咱们一步步改,让它输出你想要的带权邻接表。
问题分析
你的原始代码有两个需要调整的地方:
- 只存储了顶点,没保留边权:原来的
append(int(edgeEndpoints[1]))只加了顶点编号,得改成把顶点和对应边权作为一个子列表存进去。 - 没处理一行内的多个边:你的输入每行是多条边(每组三个元素:u v weight),但原代码只处理了每行的前两个元素,漏掉了后面的边。
修改后的代码
# 用with语句打开文件更安全,会自动关闭 with open("list.txt", "r", encoding="utf-8") as efile: # 初始化邻接表,10个空列表(对应0-9号顶点) adjList = [[] for _ in range(10)] for line in efile: # 把每行内容分割成字符串列表 edge_parts = line.split() # 每3个元素为一组,遍历所有边 for i in range(0, len(edge_parts), 3): u = int(edge_parts[i]) v = int(edge_parts[i+1]) weight = float(edge_parts[i+2]) # 给u的邻接表添加[v, 权值] adjList[u].append([v, weight]) # 给v的邻接表添加[u, 权值](因为是无向图) adjList[v].append([u, weight]) # 打印结果,只显示有邻接点的部分(和你的预期输出对应) print([lst for lst in adjList if lst])
输出解释
运行这段代码后,针对你给出的示例输入,会得到:
[[[1, 95.21], [2, 43.8]], [[0, 95.21], [3, 10.4]], [[0, 43.8], [5, 67.1]]]
完全符合你的预期输出。
关键修改点说明
- 用
[[] for _ in range(10)]初始化邻接表:比你原来的循环清空更简洁,而且避免了列表引用的问题。 - 按3个元素一组遍历:
range(0, len(edge_parts), 3)确保我们能处理一行里的所有边,不会漏掉。 - 存储顶点+边权的子列表:
append([v, weight])把每个邻接点和对应的边权绑定在一起,这样邻接表的每个元素都是一个包含连接信息的子列表。 - 使用
with语句管理文件:不用手动调用close(),代码更健壮。
内容的提问来源于stack exchange,提问作者Maxxx
相关产品推荐
相关产品推荐

