如何格式化(对齐)可变数量的数据

How to format(align) a variable amount of data

我正在尝试将数据格式化为一定数量的空格,如果它是严格数量的输入,这将非常简单,但它可能会有所不同。 例如,这是我的:

for i in LongPerEq:
     string = string + '%' + str(i) + 's '
# Where string is now '%6s %8s %9s'
line1 = string % (equations[0][0], equations[1][0], equations[2][0])
return(line1)

如您所见,我能够将 'string' 变量变成一个字符串,可以正确对齐它们,而且它不取决于我想要的 'equations' 的数量采用。所以那部分很好。问题是我有

的部分
 % (equations[0][0], equations[1][0], equations[2][0])

这是一个问题,因为它只能用于 3 个方程。它应该可用于 1、2、4 和 5。 希望这解释了我遇到的问题...任何帮助将不胜感激!

这可能是一个分为两部分的答案。第一部分是如何使传递给格式运算符“%”的元组更加灵活。这是一些示例代码:

equations = [ [ 1,2,3] , [4,5,6] , [7,8,9], [10,11,12] ]
string = "%6s %8s %9s"
line1 = string % ( equations[0][0], equations[1][0], equations[2][0]  ) 
print(line1)

# Here I am illustrating that this works for arbitrary sized equations list
string = "%6s %8s %9s %11s"
line2 = string  % tuple( e[0] for e in equations )
print(line2)

在上面,您可以看到我们从方程的所有第一个元素动态构建格式元组。

不过,您可以考虑按如下所示连接行:

不确定是否可以枚举LongPerfEq,所以我写了这个片段:

ndx = 0 
line1 = ""
for i in LongPerfEq:
  string = '%' + str(i) + 's '
  line1 += string % (equations[ndx])
  ndx += 1
return(line1)

或者,如果 enumerate 对你有用,你可以避免添加 ndx 初始化器和增量器:

line1 = ""
for ndx,i in enumerate(LongPerfEq):
  string = '%' + str(i) + 's ' 
  line1 += string % (equations[ndx]) 
return(line1)

也许您可能想查看 string.format()。

由于 format() 是一个函数,您可以将参数解压缩到其中(而不是创建一个元组来传递给 % 运算符)。

这是一个例子:

string="{0:>6s} {1:>8s} {2:>9s}  {3:>11s}" 
print( string.format( *[ e[0] for e in equations ] )  )

我们使用列表理解来 select 方程的每个成员的 0 元素,然后我们使用 * 解压列表,所以现在格式将每个列表元素作为参数。

当我使用新格式语法(即 {0:>6s} 与 %6s )时,我观察到字符串默认左对齐,所以我添加了 > 说明符来获取它右对齐。格式 {0:>6s} 表示,取第一个(第 0 个)元素并将其格式化为至少六个字符的右对齐字符串。