出力文字列のフォーマット、右揃え


148

座標x、y、zを含むテキストファイルを処理しています

     1      128  1298039
123388        0        2
....

すべての行は、3つの項目に区切られて使用されます

words = line.split()

データを処理した後、別のtxtファイルに座標を書き戻す必要があるため、各列の項目は(入力ファイルと同様に)正しく配置されます。すべての線は座標で構成されています

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

std::setw()幅と配置を設定できるC ++のようなマニピュレータはありますか?

回答:


229

新しいstr.format構文を使用してこのアプローチを試してください:

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

そして、これは古い%構文を使用してそれを行う方法です(サポートしていない古いバージョンのPythonに役立ちますstr.format):

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

39
「古い」構文がより簡潔で読みやすく、短くなっていることに注意してください。
fyngyrz 2015

2
私は私が提供される一つ以上の直接リンクを追加しようと思いました:docs.python.org/2/library/...を
brw59

47
確かに短いのですが、クリーナーが本当に何を意味するのかはわかりませんが、「読みやすい」というのは、慣れているからと思います。それらのいずれかにまだ慣れていない場合は、新しい形式の方が読みやすいようです。文字列フォーマットの「.format」は、パーセンテージ/モジュロよりも確かに直感的です。右揃えの右矢印もかなり直感的に見えます。
マーク

2
@Mark古い方法がよりクリーンな方法の1つは、使用する文字数が少ないことです。はい、慣れれば新しい方法は直感的になりますが、よりクリーンでシンプルではありません。古い方法は、模範的な簡潔さと精度の言語である由緒あるC言語を介して私たちにやって来る構文に慣れている人にとって、より直感的です。新しい方法にはどのような前例がありますか?
スティーブンボストン

2
@StephenBoston読みやすさは専門家にお任せしますが、新しい方法のほうがすっきりしています。括弧はオプションではなくなりました。%は数学演算子と混同される可能性があります(ただし、コンテキストではありそうにありませんが、一目で確認できます)。word [n]が予期されたタイプ(この場合はストリング)でない場合、古い方法は失敗します。新しい方法は、着信タイプが何であるかを知る必要はなく、常に機能します。クリーンでシンプル。公平を期すために、私はprintfスタイルに慣れることはありませんでした(主にcoutでCを行いました)。
Zim

53

これは、次を使用して実現できますrjust

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

51

あなたはそれをそのように揃えることができます:

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

Ps。リストがアンパックされることを*line意味するlineので、.format(*line)同様に機能します.format(line[0], line[1], line[2])line要素が3つだけのリストであると想定)。



18

「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文字で左揃えであり、2番目の列(値)が10文字で右揃えであることを示しています。


フォーマットの幅をパラメータ化する方法はありますか?この例では、フォーマットを20と15の幅に変更する場合、複数の行を変更する必要があります。widths = [15, 10] f"{'Trades:':<width[0]}{cnt:>width[1]}",上記のようなsthを達成したいと思います。
TomaszSabała19年

1
とった!多分誰かがそれが役に立つと思うでしょう。:私はこのように1つの以上のネストされた括弧必要f"{'Trades:':<{width[0]}}{cnt:>{width[1]}}"
トマシュSabała

1
時々、最良の答えは正確な質問に答えないものです。これをありがとう!:)
ブライアンワイリー

5

出力の簡単な表:

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は小数点以下の桁数です。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.