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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:59:24