簡體   English   中英

格式化輸出字符串,右對齊

[英]Format output string, right alignment

我正在處理一個包含坐標 x、y、z 的文本文件

     1      128  1298039
123388        0        2
....

每行都使用分隔成 3 個項目

words = line.split()

處理數據后,我需要將坐標寫回另一個 txt 文件,以便每列中的項目(以及輸入文件)對齊。 每條線都由坐標組成

line_new = words[0]  + '  ' + words[1]  + '  ' words[2].

在 C++ 中是否有像std::setw()等允許設置寬度和對齊方式的操縱器?

使用較新的str.format語法嘗試這種方法:

line_new = '{:>12}  {:>12}  {:>12}'.format(word[0], word[1], word[2])

以下是如何使用舊的%語法(對於不支持str.format舊版 Python 很有用):

line_new = '%12s  %12s  %12s' % (word[0], word[1], word[2])

你可以這樣對齊:

print('{:>8} {:>8} {:>8}'.format(*words))

其中>表示“向右對齊”, 8是特定值的寬度

這是一個證明:

>>> for line in [[1, 128, 1298039], [123388, 0, 2]]:
    print('{:>8} {:>8} {:>8}'.format(*line))


       1      128  1298039
  123388        0        2

附言。 *line表示line列表將被解包,因此.format(*line)工作方式與.format(line[0], line[1], line[2])類似(假設line是一個只有三個元素的列表)。

可以通過使用rjust來實現:

line_new = word[0].rjust(10) + word[1].rjust(10) + word[2].rjust(10)

這是使用“f-string”格式進行格式化的另一種方法:

print(
    f"{'Trades:':<15}{cnt:>10}",
    f"\n{'Wins:':<15}{wins:>10}",
    f"\n{'Losses:':<15}{losses:>10}",
    f"\n{'Breakeven:':<15}{evens:>10}",
    f"\n{'Win/Loss Ratio:':<15}{win_r:>10}",
    f"\n{'Mean Win:':<15}{mean_w:>10}",
    f"\n{'Mean Loss:':<15}{mean_l:>10}",
    f"\n{'Mean:':<15}{mean_trd:>10}",
    f"\n{'Std Dev:':<15}{sd:>10}",
    f"\n{'Max Loss:':<15}{max_l:>10}",
    f"\n{'Max Win:':<15}{max_w:>10}",
    f"\n{'Sharpe Ratio:':<15}{sharpe_r:>10}",
)

這將提供以下輸出:

Trades:              2304
Wins:                1232
Losses:              1035
Breakeven:             37
Win/Loss Ratio:      1.19
Mean Win:           0.381
Mean Loss:         -0.395
Mean:               0.026
Std Dev:             0.56
Max Loss:          -3.406
Max Win:             4.09
Sharpe Ratio:      0.7395

您在這里所做的是說第一列長 15 個字符且左對齊,第二列(值)長 10 個字符且右對齊。

如果您從列表中加入項目並且想要格式化項目之間的空間,您可以使用 `` 和常規格式化技術。

此示例將每個數字用 3 個空格分隔。 這里的關鍵是f"{'':>3}"

print(f"{'':>3}".join(str(i) for i in range(1, 11)))

輸出:

1   2   3   4   5   6   7   8   9   10

我真的很喜歡 Python 3.6+ 中的新文字字符串插值:

line_new = f'{word[0]:>12}  {word[1]:>12}  {word[2]:>12}'

參考: PEP 498——文字字符串插值

輸出的簡單列表:

a = 0.3333333
b = 200/3
print("variable a    variable b")
print("%10.2f    %10.2f" % (a, b))

輸出:

variable a    variable b
      0.33         66.67

%10.2f: 10 是最小長度,2 是小數位數。

要通過使用 f-string 並控制尾隨數字的數量來做到這一點:

print(f'A number -> {my_number:>20.5f}')

將 Vlad 的精美內容與其他內容混合在一起,代碼也可以編寫為可讀性和易用性,例如......

>>> cnt = wins = losses      = str(   2)
>>> evens = win_r = mean_w   = str(  14)
>>> mean_l = mean_trd = sd   = str( 336)
>>> max_l = max_w = sharpe_r = str(4278)
>>>
>>> rpad = 10
>>>
>>> print(
...     '\n Trades         ' +      cnt.rjust(rpad),
...     '\n Wins           ' +     wins.rjust(rpad),
...     '\n Losses         ' +   losses.rjust(rpad),
...     '\n Breakeven      ' +    evens.rjust(rpad),
...     '\n Win/Loss Ratio ' +    win_r.rjust(rpad),
...     '\n Mean Win       ' +   mean_w.rjust(rpad),
...     '\n Mean Loss      ' +   mean_l.rjust(rpad),
...     '\n Mean           ' + mean_trd.rjust(rpad),
...     '\n Std Dev        ' +       sd.rjust(rpad),
...     '\n Max Loss       ' +    max_l.rjust(rpad),
...     '\n Max Win        ' +    max_w.rjust(rpad),
...     '\n Sharpe Ratio   ' + sharpe_r.rjust(rpad),
... )

 Trades                  2
 Wins                    2
 Losses                  2
 Breakeven              14
 Win/Loss Ratio         14
 Mean Win               14
 Mean Loss             336
 Mean                  336
 Std Dev               336
 Max Loss             4278
 Max Win              4278
 Sharpe Ratio         4278

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM