如何使用Python将数字打印到文本文件的柱状结构中

时间:2018-03-25 15:44:58

标签: python python-3.x printing

这个问题可能与我缺乏想象力有关,但我有一个相对简单的问题,我正试图解决。我正在尝试编写一个函数,允许您将数组或数字列表写入终端或带有列输出的文本文件,我正在遇到一个基本问题。我的函数中的方法如下所示。

j = 0
length = int(len(result)/4)
for i in range(length):
    print('{:6.4e}{}{:6.4e}{}{:6.4e}{}{:6.4e}'.format(result[j], ' ',
                                              result[j + 1], ' ',
                                              result[j + 2], ' ',
                                              result[j + 3]))
    j = j + 4

正如您所看到的,它不是一个非常优雅的实现,并且遇到了问题。您的输出必须是4的偶数倍,否则不会打印剩余的数字。例如,如果数字是

np.array([0.0, 34.681, 54.281, 22.987, 101.785, 34.187, 101.16, 298.7, 
          39.841, 8.731])

输出应为

0.0000e+00 3.4681e+01 5.4281e+01 2.2987e+01
1.0179e+02 3.4187e+01 1.0160e+02 2.9870e+01
3.9841e+01 8.731e+01

但输出将是

0.0000e+00 3.4681e+01 5.4281e+01 2.2987e+01
1.0179e+02 3.4187e+01 1.0160e+02 2.9870e+01

所以我的第一个问题是如何重写这个print语句来处理不均匀行的打印?第二,是否有一种更优雅的方式来重写print语句,所以我不必手动编写'{:.64e}{}{:.64e}{}{:64e}{}{:.64e}'语句,特别是因为我希望将列数作为用户输入函数的功能并且不要我不想手动将每种可能性写入一系列if语句。

3 个答案:

答案 0 :(得分:0)

如果您不介意每行末尾有一个额外的(通常是不可见的)空格:

NCOLS = 4 # Number of columns
SEP = " " # Column separator
for i,value in enumerate(result):
    print('{:6.4e}'.format(value), end=SEP)
    if i % NCOLS == NCOLS - 1: 
        print() # A line break
if i % NCOLS != NCOLS - 1: 
        print() # The final line break

输出:

0.0000e+00 3.4681e+01 5.4281e+01 2.2987e+01 
1.0179e+02 3.4187e+01 1.0160e+02 2.9870e+01 
3.9841e+01 8.7310e+01

答案 1 :(得分:0)

主题的变化:

a = np.array([0.0, 34.681, 54.281, 22.987, 101.785,
              34.187, 101.16, 298.7, 39.841, 8.731])

ncols = 4
nrows = (len(a) // ncols) + 1
s = '{:<12.4e}'    # two spaces separating the columns
for row in range(nrows):
    start = row * ncols
    group = slice(start, start + ncols)
    line = a[group]
    fmt = s * len(line)
    print(fmt.format(*line))

依赖于一个停止值大于行为正常的序列长度的切片 - 它就是这样。

答案 2 :(得分:-1)

将列表拆分为四个一组的最简单方法是使用切片。如果您在处理完元素后删除了元素,则当列表变空时,迭代可以停止(如果您不想销毁列表,则需要先复制该列表)。切片的优点在于它处理的情况是没有足够的元素剩余一整片。

但是,您必须使用可容纳1到4个任意数量项目的打印技术。

while len(result):
    this_line = result[:4]
    result = result[4:]
    line = ["{:6.4e}".format(item) for item in this_line]
    print(" ".join(line))

如果您构建一个以这种方式工作的函数,您可以使用指定要打印的列数的参数替换文字4,代码应该仍然有用。

最后注意事项:此外,无需通过替换空格来插入空格。在您最初的尝试中,您可以将空格直接放在格式字符串中并写入

    print('{:6.4e} {:6.4e} {:6.4e} {:6.4e}'.format(result[j],
                                              result[j + 1],
                                              result[j + 2],
                                              result[j + 3]))

如果您不想复制列表销毁它,另一种可能性是保持到目前为止打印的行长度之和,并使用{{1} }。