
本文介绍如何不依赖 numpy 或 pandas,仅用标准库和嵌套循环,将一组具有 x/y 坐标的客户对象构建成完整的二维距离矩阵(即对称方阵),其中 `distances[i][j]` 表示第 i 位客户与第 j 位客户之间的欧氏距离。
要生成真正的二维距离矩阵(而非一维扁平列表),关键在于:外层循环按客户索引 i 迭代,内层循环为该客户 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) # 将整行加入矩阵此时 Distances 是一个 nr_customers × nr_customers 的嵌套列表,满足:
- Distances[i][j] 即客户 i 到客户 j 的距离;
- 对角线元素 Distances[i][i] 恒为 0.0(自距离);
- 矩阵关于主对角线对称(因欧氏距离满足 d(i,j) = d(j,i))。
✅ 注意事项:
立即学习“Python免费学习笔记(深入)”;
- 务必确保 customer 是已定义的客户对象列表,且每个对象实现了 getX() 和 getY() 方法;
- 若客户数量较大(如 >1000),该 O(n²) 算法仍可运行,但性能不如向量化库;不过本方案严格遵守“禁用 NumPy/Pandas”的约束;
- 可进一步封装为函数提升复用性:
def build_distance_matrix(customers):
n = len(customers)
matrix = []
for i in range(n):
row = []
for j in range(n):
row.append(get_distance(customers[i], customers[j]))
matrix.append(row)
return matrix
# 使用示例
Distances = build_distance_matrix(customer)该方法简洁、可读性强,完全基于 Python 原生语法,是教学与轻量级场景下构建距离矩阵的标准实践。










