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

如何使用Python将数字打印到文本文件的列结构中,python,python-3.x,printing,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], ' ',

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

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}}{/code>语句,特别是因为我希望将列数作为函数的用户输入函数,并且不希望手动将每个可能性写入一系列if语句。

如果您不介意在每行末尾添加一个额外(通常不可见)空间:

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到4个项目中的任意数量

while len(result):
    this_line = result[:4]
    result = result[4:]
    line = ["{:6.4e}".format(item) for item in this_line]
    print(" ".join(line))
如果您构建了一个这样工作的函数,那么您可以用一个指定要打印的列数的参数来替换literal
4
,并且代码仍然可以工作

最后一点注意:另外,不需要通过替换空格来插入空格。在最初的尝试中,您可以将空格直接写入格式字符串中

    print('{:6.4e} {:6.4e} {:6.4e} {:6.4e}'.format(result[j],
                                              result[j + 1],
                                              result[j + 2],
                                              result[j + 3]))
如果您不想复制或销毁列表,另一种可能是保留到目前为止打印的行的长度总和,并在主题上使用
而length\u sum
变体:

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))
a=np.数组([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='{:@holdenweb对不起?这正好回答了OP的问题。即使是数字3和4,它也直接回答了OP的问题:“你的输出必须是4的偶数倍”。很明显,这是OP描述了他想要克服的解决方案的局限性。否则,他给出的解决方案已经起作用了,不是吗?当然,你的解决方案也不是一般性的。不,但我有(感谢你的评论)指出它是如何概括的。如果你对我的答案投了反对票,因为你对我对你的答案投了反对票,我可以接受。因为你的解决方案(现在)是这样的在一般情况下工作我已删除了下一票,但注释仍然有效。此书面解决方案不起作用。
while result
行产生一个值错误,ValueError:具有多个元素的数组的真值不明确。如果将其替换为
while result.any(),请使用a.any()或a.all()
代码有效是的,问题说的是“数组或列表”,不是吗?Drat!谢谢。我今天有点不舒服,显然最好不要发布-你没有指出我每行只打印3个值!不管怎样,现在已经修复了,所以它也适用于数组。