
本文介绍如何不依赖 numpy 或 pandas,仅用标准库和嵌套循环,将一组具有 x/y 坐标的客户对象构建成完整的二维距离矩阵(即对称方阵),每行表示某客户到所有客户的欧氏距离。
要生成真正的二维距离矩阵(而非扁平化的一维列表),关键在于:外层循环遍历每个客户 i,内层循环计算 i 到所有客户 j 的距离,并将这些距离收集为一个子列表;再将该子列表整体追加到主列表中。这样最终得到的 Distances 就是一个 n × n 的嵌套列表,满足 Distances[i][j] 表示第 i 个客户到第 j 个客户的欧氏距离。
以下是修正后的完整实现(假设已导入 math.sqrt):
from math import sqrt
# 距离计算函数(优化版:直接返回,避免中间变量)
def get_distance(a, b):
dx = a.getX() - b.getX()
dy = a.getY() - b.getY()
return sqrt(dx * dx + dy * dy)
# 构建二维距离矩阵
Distances = []
for i in range(nr_customers):
row = [] # 初始化第 i 行
for j in range(nr_customers):
row.append(get_distance(customer[i], customer[j]))
Distances.append(row) # 将整行加入矩阵✅ 结果验证示例:
若 nr_customers = 3,则 Distances 形如:
[
[0.0, d01, d02], # customer[0] → all
[d10, 0.0, d12], # customer[1] → all
[d20, d21, 0.0] # customer[2] → all
]由于欧氏距离对称,dij == dji,且对角线恒为 0.0(自身到自身距离为 0)。
⚠️ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 确保 customer 是长度为 nr_customers 的客户对象列表,且每个对象实现了 getX() 和 getY() 方法;
- 若需提升性能(尤其客户数 > 1000),可考虑提前缓存坐标元组(如 coords = [(c.getX(), c.getY()) for c in customer]),避免重复调用方法;
- 本方案时间复杂度为 O(n²),空间复杂度也为 O(n²),适用于中小规模数据;
- 文中提及的 scipy.spatial.distance_matrix 虽简洁高效,但因明确禁止使用第三方科学计算库,故不作为推荐解法,仅作知识补充。
至此,你已获得一个结构清晰、可直接索引访问的标准二维距离矩阵,可用于后续路径规划、聚类分析或启发式算法等场景。










