You need to enable JavaScript to run this app. Python大字符串/数组固定格式打印实现:每行9个数值且小数点对齐
优惠活动
大模型
产品
解决方案
定价
更多

Python大字符串/数组固定格式打印实现:每行9个数值且小数点对齐

Python 定长行输出+数值小数点对齐实现

问题描述

我需要将体量较大的字符串或数组按固定格式打印输出,以便与目标数据文件完成比对。

原始代码与问题

原有测试代码如下(Python 2 语法):

import re

string1 ='2222//000000'
string2 = '-0.0000023   0.0000008   0.0000001   0.9716336  -0.1052695  -0.0000001  -0.0000002   0.0000007  -0.0000000 \
            0.0000000   0.0000000   0.1316705   0.1175425  -0.0000000   0.0000000   0.0000000   0.0000000   0.0000000 \
            0.0000000   0.0000000   0.0000003   0.0000000  -0.0000001  -0.0000000   0.0000000  -0.0000000   0.0000001 \
            0.0000000  -0.0000003   0.0000000  -0.0000000  -0.0000001  -0.0000001   0.0106146   0.1165349'

split = re.findall(r'(?:\b|-)\d+(?:\.\d+)?', string2)

for i in range (3):
    print  "{0:<18}".format( string1 ),
    for j in range ( len(split) ):
        print "{0:<10}".format(split[j]),
        if j != 0 and j%9 == 0:
            print "\n", "{0:<18}".format("      " ),
    print  "\n"

原有输出的问题:

  • 数值用左对齐格式化,小数点位置不统一
  • 换行逻辑判断冗余,容易出现行元素数量不对的情况
  • 后续行的缩进宽度和首行标识字符串不匹配
  • 冗余的外层循环for i in range(3)会导致重复输出3次相同内容,不符合需求

调整方案

核心调整点

  1. 数值对齐处理:将拆分后的字符串转成浮点数,统一用固定宽度、固定小数位的格式输出,保证小数点自动对齐(本次样本数值均为7位小数,设置单值占12位宽度、保留7位小数即可实现对齐)
  2. 分组处理:先把拆分后的数值按每9个一组拆分,从逻辑上避免逐元素判断换行的冗余
  3. 行前缀处理:首行输出左对齐占18位的string1,后续行直接输出18位宽度的空格作为前缀,保证缩进对齐

调整后代码(兼容Python 2/3)

import re

string1 = '2222//000000'
string2 = '-0.0000023   0.0000008   0.0000001   0.9716336  -0.1052695  -0.0000001  -0.0000002   0.0000007  -0.0000000 \
            0.0000000   0.0000000   0.1316705   0.1175425  -0.0000000   0.0000000   0.0000000   0.0000000   0.0000000 \
            0.0000000   0.0000000   0.0000003   0.0000000  -0.0000001  -0.0000000   0.0000000  -0.0000000   0.0000001 \
            0.0000000  -0.0000003   0.0000000  -0.0000000  -0.0000001  -0.0000001   0.0106146   0.1165349'

# 拆分数值
num_list = [float(s) for s in re.findall(r'-?\d+\.\d+', string2)]
# 按每9个元素分组
grouped_nums = [num_list[i:i+9] for i in range(0, len(num_list), 9)]

for line_idx, group in enumerate(grouped_nums):
    # 首行放string1,后续行用等宽空格填充
    prefix = "{0:<18}".format(string1) if line_idx == 0 else " " * 18
    # 格式化每个数值:右对齐占12位,保留7位小数,自动对齐小数点
    line_content = "".join(["{:>12.7f}".format(num) for num in group])
    print(prefix + line_content)

输出效果

2222//000000        -0.0000023   0.0000008   0.0000001   0.9716336  -0.1052695  -0.0000001  -0.0000002   0.0000007  -0.0000000
                     0.0000000   0.0000000   0.1316705   0.1175425  -0.0000000   0.0000000   0.0000000   0.0000000   0.0000000
                     0.0000000   0.0000000   0.0000003   0.0000000  -0.0000001  -0.0000000   0.0000000  -0.0000000   0.0000001
                     0.0000000  -0.0000003   0.0000000  -0.0000000  -0.0000001  -0.0000001   0.0106146   0.1165349

如果需要调整数值宽度,只要修改{:>12.7f}里的12即可,7对应需要保留的小数位数,和样本的小数位匹配就能保证小数点完全对齐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 02:15:05