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

如何解析文本文件中的距离矩阵数据并格式化输出?

解析距离矩阵文本并实现规整展示与查询

问题说明

需要解析一份分块存储的10x10距离矩阵文本文件,将数据整理为可直接查询的结构,同时输出规整的表格格式。原文件内容如下:

Distance (m): 
                1             2             3             4             5 
      1  0.000000D+00
      2  0.753566D+02  0.000000D+00
      3  0.122200D+01  0.718244D+02  0.000000D+00
      4  0.2553551D+00 -0.190505D+01  0.835309D+02  0.000000D+00
      5 -0.2153D+01  0.650008D+00 -0.28353736D+01  0.673503D+02  0.000000D+00
      6  0.772331D+02 -0.263367D+01  0.125687D+00 -0.245234204D+01  0.722401D+02
      7  0.1735236D+01 -0.570005D+00  0.241723D+01  0.3224293D+01  0.413630D+02
      8 -0.849551D+00 -0.154230D+01  0.1488443D+02  0.235537D+01  0.961729D+00
      9 -0.180118D+00  0.141798D+00  0.156748D+00  0.153549D+01  0.211804D-01
     10  0.20363676D+00 -0.990433D-01  0.160539D+00  0.231715D+00  0.142838D+01
           6             7             8             9            10 
      6  0.000000D+00
      7  0.203361D+01  0.000000D+00
      8 -0.502446D+00  0.141591D+00  0.000000D+00
      9 -0.9242897D-01  0.403504D+02  0.104142D+00  0.000000D+00
     10 -0.744021D-02  0.122414D+02 -0.224381D-01  0.245097D+02  0.000000D+00
  End

原代码因未处理矩阵的分块结构,导致数据行不完整,输出混乱。需要修正代码以构建完整的距离矩阵,并支持两点距离查询。

修正后的代码

def parse_distance_matrix(file_path):
    distance_matrix = {}
    current_section = 0  # 0表示前5列,1表示后5列
    point_count = 10
    # 初始化每个点的距离列表,点编号从1开始
    for i in range(1, point_count+1):
        distance_matrix[i] = [0.0]*(point_count+1)
    
    with open(file_path, 'r') as file:
        capture_data = False
        for line in file:
            stripped_line = line.strip()
            if not stripped_line:
                continue
            if "Distance (m)" in stripped_line:
                capture_data = True
                continue
            if "End" in stripped_line:
                break
            # 判断列标题行,切换数据块
            if stripped_line.startswith(('1 ', '6 ')) and all(c.isdigit() or c.isspace() for c in stripped_line):
                current_section = 1 if '6' in stripped_line else 0
                continue
            
            # 处理数据行
            if capture_data:
                parts = stripped_line.split()
                if not parts:
                    continue
                point_num = int(parts[0])
                # 转换科学计数法格式并转浮点型
                values = [float(v.replace('D', 'E')) for v in parts[1:]]
                
                # 根据当前数据块填充对应列,利用矩阵对称性同步填充对称位置
                if current_section == 0:
                    for idx, val in enumerate(values):
                        col_num = idx + 1
                        distance_matrix[point_num][col_num] = val
                        distance_matrix[col_num][point_num] = val
                else:
                    for idx, val in enumerate(values):
                        col_num = idx + 6
                        distance_matrix[point_num][col_num] = val
                        distance_matrix[col_num][point_num] = val
    return distance_matrix

def print_matrix(matrix):
    point_count = len(matrix)
    # 打印表头
    header = "    " + " ".join(f"{i:>5}" for i in range(1, point_count+1))
    print(header)
    # 打印每行数据,保留1位小数
    for point in sorted(matrix.keys()):
        row_vals = [f"{val:>5.1f}" for val in matrix[point][1:]]
        print(f"{point:>2} " + " ".join(row_vals))

def get_distance(matrix, point_a, point_b):
    if point_a not in matrix or point_b not in matrix:
        return None
    return matrix[point_a][point_b]

# 使用示例
if __name__ == "__main__":
    dist_matrix = parse_distance_matrix('distance_data.txt')
    # 打印规整矩阵
    print("规整距离矩阵:")
    print_matrix(dist_matrix)
    
    # 查询两点距离示例
    a, b = 1, 10
    distance = get_distance(dist_matrix, a, b)
    if distance is not None:
        print(f"\n点{a}到点{b}的距离为{distance:.1f}米")

代码说明

  1. 矩阵构建:通过current_section区分前后两个数据块,将数值填充到对应位置,同时利用距离矩阵的对称性,自动填充对称点的距离值。
  2. 数据转换:将文本中的D替换为科学计数法标准的E,并转换为浮点型数值。
  3. 规整输出:自定义打印格式,确保每行每列对齐,保留1位小数提升可读性。
  4. 查询功能:通过get_distance函数可直接查询任意两点间的距离,异常点会返回None。

输出示例

规整矩阵输出:

1     2     3     4     5     6     7     8     9    10
 1   0.0  75.4   1.2   0.3  -2.2  77.2   1.7  -0.8   0.0   0.2
 2  75.4   0.0  71.8  -1.9   0.7  -2.6  -0.6  -1.5   0.1  -0.1
 3   1.2  71.8   0.0  83.5  -2.8   0.1   2.4  14.9   0.2   0.2
 4   0.3  -1.9  83.5   0.0  67.4  -2.5  32.2  23.6  15.4   0.2
 5  -2.2   0.7  -2.8  67.4   0.0  72.2  41.4   1.0   0.0  14.3
 6  77.2  -2.6   0.1  -2.5  72.2   0.0   2.0  -0.5   0.0   0.0
 7   1.7  -0.6   2.4  32.2  41.4   2.0   0.0   0.1 403.5 122.4
 8  -0.8  -1.5  14.9  23.6   1.0  -0.5   0.1   0.0   0.1   0.0
 9   0.0   0.1   0.2  15.4   0.0   0.0 403.5   0.1   0.0 245.1
10   0.2  -0.1   0.2   0.2  14.3   0.0 122.4   0.0 245.1   0.0

查询输出:

点1到点10的距离为0.2米

内容的提问来源于stack exchange,提问作者manuelpb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 02:30:55