如何解析文本文件中的距离矩阵数据并格式化输出?
解析距离矩阵文本并实现规整展示与查询
问题说明
需要解析一份分块存储的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}米")
代码说明
- 矩阵构建:通过
current_section区分前后两个数据块,将数值填充到对应位置,同时利用距离矩阵的对称性,自动填充对称点的距离值。 - 数据转换:将文本中的
D替换为科学计数法标准的E,并转换为浮点型数值。 - 规整输出:自定义打印格式,确保每行每列对齐,保留1位小数提升可读性。
- 查询功能:通过
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
相关产品推荐
相关产品推荐

