我应该如何使以下打印语句在一行的每一部分都使用一致数量的空格?

时间:2018-06-24 04:27:00

标签: python printing

如何使以下打印语句的每个部分(历元,时间,损失等)占用一致的空间。当前,它们是不一致的,因为某些浮点值有时会占用5个空格或6个空格(例如10.345、2.123)。

print('Epoch: [{0}][{1}/{2}]\t'
      'Time: {batch_time.val:.3f} ({batch_time.avg:.3f})\t'
      'Loss: {loss.val:.4f} ({loss.avg:.4f})\t'
      'Prec@1: {top1.val:.3f}% ({top1.avg:.3f}%)\t'
      'Prec@5: {top5.val:.3f}% ({top5.avg:.3f}%)'.format(
       epoch, i, len(data_loader), batch_time=batch_time,
       loss=losses, top1=top1, top5=top5))

示例:

Epoch: [4][90/1770] | Time: 0.315 (0.321) | Loss: 1.5111 (1.6552) | Prec@1: 72.266% (67.943%) | Prec@5: 84.375% (83.001%)
Epoch: [4][100/1770] | Time: 0.314 (0.320) | Loss: 1.6079 (1.6558) | Prec@1: 70.312% (67.965%) | Prec@5: 84.766% (82.990%)

如您所见,每个部分的间距不一致。预先添加的空格不起作用,因为要添加的空格数量必须根据值的长度(90/1770与100/1770)而不同。

我知道我可以以打印格式进行{:5.3f}的操作,但是我的打印语句存在的问题是,有些是固定单词,如“ Epoch”,而有些则是变量,即值。我该如何处理这种情况?我需要使整个块而不只是值保持一致。

2 个答案:

答案 0 :(得分:0)

您已经知道如何为浮点数添加宽度:

  

我了解我可以以打印格式进行{:5.3f}

您可以对整数或任何其他类型进行完全相同的操作。

print('Epoch: [{0:1}][{1:3}/{2:4}]\t'
      'Time: {batch_time.val:5.3f} ({batch_time.avg:5.3f})\t'
      # and so on

{1:3}意味着90将在其前面显示一个空格,如下所示:

Epoch: [4][ 90/1770] | Time: 0.315 (0.321) | Loss: 1.5111 (1.6552) | Prec@1: 72.266% (67.943%) | Prec@5: 84.375% (83.001%)

因此它将与下一行对齐:

Epoch: [4][100/1770] | Time: 0.314 (0.320) | Loss: 1.6079 (1.6558) | Prec@1: 70.312% (67.965%) | Prec@5: 84.766% (82.990%)

如果您还没有阅读Format Specification Mini-Language的文档,而只是在猜测如何更改在随机在线代码中找到的示例,希望他们可以按照您的意愿进行操作,请阅读文档。一切都很简单。


您还说:

  

我的打印语句的问题在于,有些是固定词,例如“ Epoch”。

首先,固定字符串似乎不是问题。

如果是这样,只需手动添加空格就可以使它们具有相同的宽度。

如果确实需要,可以将这些固定的字符串存储在变量中,并为其添加格式字段,因此您可以在某处添加宽度字段:

print('{epoch_label:6}: [{0:1}][{1:3}/{2:4}]\t'
      '{time_label:6}: {batch_time.val:5.3f} ({batch_time.avg:5.3f})\t'
      # etc.
      loss=losses, top1=top1, top5=top5, 
      epoch_label='Epoch', time_label='Time'))

...但是这似乎很愚蠢。

答案 1 :(得分:0)

您也可以玩'center','rjust'和'ljust':

In [23]: for a,b,c,d in ( (4,90,1770,0.315), (4,100,1770,0.314)):
    ...:     print("Epoch: "+f"[{a}][{b}/{c}]".center(15)+"| Time: "+f"{d:.3f}".center(8)+"|")
    ...:     

Epoch:   [4][90/1770] | Time:  0.315  |
Epoch:  [4][100/1770] | Time:  0.314  |