如何用Python将数字以列结构输出到文本文件?
按列格式化输出数字数组的优化方案
嘿,我明白你现在卡在按列输出数字数组的问题上了——手动硬编码格式字符串确实容易陷入思路瓶颈,咱们来换个更灵活、通用的实现方式!
首先得说说你现有代码的小局限:
- 硬编码了4列,要是数组长度不是4的倍数,最后一行会缺元素甚至报错
- 重复写四次
{:6.4e},不仅冗余,后续要改列数或格式就得挨个修改
优化后的实现思路
核心是先按列拆分数组,再逐行拼接输出,这样不管数组长度是多少、要分几列,都能自动适配:
- 计算需要的行数:用
math.ceil(len(arr)/cols)向上取整,哪怕数组长度不是列数的整数倍,也能保证所有元素都被包含 - 按列拆分元素:用切片
arr[i::cols],比如第0列取索引0、4、8...的元素,第1列取1、5、9...的元素,以此类推 - 对齐补全不足的行:用
itertools.zip_longest把各列的行对齐,缺元素的位置用占位符补全,保证输出格式整齐
完整代码示例
import math from itertools import zip_longest def print_columns(arr, cols=4, fmt='{:6.4e}'): # 计算需要的行数,向上取整确保所有元素都能放下 rows = math.ceil(len(arr) / cols) # 按列拆分数组,每一列是原数组中每隔cols个元素取一个 columns = [arr[i::cols] for i in range(cols)] # 遍历每一行,把各列对应位置的元素格式化后拼接 for row in zip_longest(*columns, fillvalue=''): # 对每个元素应用格式,空占位符用对应长度的空格填充保证对齐 formatted_items = [] for item in row: if item != '': formatted_items.append(fmt.format(item)) else: # 计算格式字符串的长度,用空格填充 placeholder_length = len(fmt.format(0)) formatted_items.append(' ' * placeholder_length) # 用空格分隔每一列,打印输出 print(' '.join(formatted_items)) # 测试一下 test_array = [1.2345e-6, 2.3456e-5, 3.4567e-4, 4.5678e-3, 5.6789e-2, 6.7890e-1, 7.8901, 8.9012, 9.0123] print_columns(test_array)
输出到文本文件的修改
如果要把结果写入文件而不是终端,只需要把print改成文件写入操作就行:
with open('output.txt', 'w') as f: for row in zip_longest(*columns, fillvalue=''): # 复用上面的格式化逻辑 formatted_items = [] for item in row: if item != '': formatted_items.append(fmt.format(item)) else: placeholder_length = len(fmt.format(0)) formatted_items.append(' ' * placeholder_length) f.write(' '.join(formatted_items) + '\n')
这样修改后,不管你要分3列、5列,还是调整格式为{:8.2f},只需要调用函数时传对应的参数就行,灵活性拉满!
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

