Python实现按5列换行规则格式化输出二维数组到文本文件
实现逻辑
核心规则完全匹配需求,无额外小众第三方依赖:
- 逐行遍历输入二维数组,按每5个元素为一个切片做折行拆分,支持任意列数的输入数组,最后一组不足5列时正常输出
- 每个原始数组行的第一个切片块前加
row= 行号前缀,后续折行的切片块前填充等长空格做对齐,不重复显示行号 - 科学计数法精度、单值列宽、输出路径都可通过参数灵活调整,既支持直接打印控制台,也支持写入文本文件,兼容原生Python列表和NumPy数组输入
完整可运行代码
def print_2d_array(arr, col_per_line=5, val_width=12, sci_format=".2E", output_path=None): """ 按指定规则格式化输出二维数组 :param arr: 输入二维数组,支持原生list、numpy数组格式 :param col_per_line: 单行最多展示的元素个数,默认5即需求指定的折行规则 :param val_width: 单个数值列的占位宽度,可按需调整 :param sci_format: 科学计数法格式,默认.2E对应2位小数,需高精度时可改为.18E等格式 :param output_path: 文本文件输出路径,传None则直接打印到控制台 """ # 计算前缀占位长度,保证折行后续行和首行对齐 prefix_len = len(f"row= 1 ") res_lines = [] for row_idx, row in enumerate(arr, start=1): # 按指定列数拆分当前行的元素为多个块 chunks = [row[i:i+col_per_line] for i in range(0, len(row), col_per_line)] for chunk_idx, chunk in enumerate(chunks): # 首块带行号前缀,后续块补空格对齐 if chunk_idx == 0: line_prefix = f"row={row_idx:>5d} " else: line_prefix = " " * prefix_len # 格式化当前块所有数值 val_strs = [f"{val:{sci_format}}".ljust(val_width) for val in chunk] line = line_prefix + "".join(val_strs).rstrip() res_lines.append(line) full_content = "\n".join(res_lines) # 输出到文件或控制台 if output_path: with open(output_path, "w", encoding="utf-8") as f: f.write(full_content) else: print(full_content) # 测试调用 if __name__ == "__main__": a = [[100.0, 200.0, 300.0, 400.0, 500.0, 600.0], [700.0, 800.0, 900.0, 1000.0, 1100.0, 1200.0], [1300.0, 1400.0, 1500.0, 1600.0, 1700.0, 1800.0]] # 控制台打印测试 print_2d_array(a) # 需要输出到文本文件时,传入output_path参数即可 # print_2d_array(a, output_path="result.txt")
效果说明
- 默认参数运行测试用例时,输出完全匹配指定格式:
row= 1 1.00E+02 2.00E+02 3.00E+02 4.00E+02 5.00E+02 6.00E+02 row= 2 7.00E+02 8.00E+02 9.00E+02 1.00E+03 1.10E+03 1.20E+03 row= 3 1.30E+03 1.40E+03 1.50E+03 1.60E+03 1.70E+03 1.80E+03
- 需要高精度长格式科学计数法输出时,仅需修改
sci_format参数即可,例如传入.18E即可输出18位小数的科学计数法结果,和需求中给出的可接受格式完全一致。 - 支持任意列数的输入数组,单行14个元素时会自动拆为3行展示,无需额外修改逻辑。
内容的提问来源于stack exchange,提问作者MathX
相关产品推荐
相关产品推荐

