文字列を固定幅で印刷する方法は?


103

私はこのコードを持っています(文字列内のすべての順列の出現を出力します)

def splitter(str):
    for i in range(1, len(str)):
        start = str[0:i]
        end = str[i:]
        yield (start, end)
        for split in splitter(end):
            result = [start]
            result.extend(split)
            yield result    

el =[];

string = "abcd"
for b in splitter("abcd"):
    el.extend(b);

unique =  sorted(set(el));

for prefix in unique:
    if prefix != "":
        print "value  " , prefix  , "- num of occurrences =   " , string.count(str(prefix));

文字列変数にあるすべての順列出現を出力したい。

順列が同じ長さではないので、幅を修正して次のような素敵なものに印刷したいと思います。

value   a - num of occurrences =    1
value   ab - num of occurrences =    1
value   abc - num of occurrences =    1
value   b - num of occurrences =    1
value   bc - num of occurrences =    1
value   bcd - num of occurrences =    1
value   c - num of occurrences =    1
value   cd - num of occurrences =    1
value   d - num of occurrences =    1

どうすれば使用できformatますか?

私はこれらの投稿を見つけましたが、英数字の文字列ではうまくいきませんでした:

Pythonの文字列フォーマットの固定幅

Pythonで固定長を設定する


1
印刷 '%10s'% 'mystring'についてはどう
ですか

2
"\t"どのソリューションでもオプションとしてリストされていないことに驚いています。

回答:


112

編集2013-12-11-この回答は非常に古いものです。それはまだ有効で正しいですが、これを見ている人は新しいフォーマット構文を好むはずです

次のような文字列フォーマットを使用できます。

>>> print '%5s' % 'aa'
   aa
>>> print '%5s' % 'aaa'
  aaa
>>> print '%5s' % 'aaaa'
 aaaa
>>> print '%5s' % 'aaaaa'
aaaaa

基本的に:

  • %文字知らせるには、それがトークンに代替何かする必要がありますPYTHON
  • sトークンのpython文字知らせるには、文字列になります
  • 5(または何でもあなたが望む数)5つの文字にスペースを上にして、文字列をパッドにパイソンを知らせます。

特定のケースでは、可能な実装は次のようになります。

>>> dict_ = {'a': 1, 'ab': 1, 'abc': 1}
>>> for item in dict_.items():
...     print 'value %3s - num of occurances = %d' % item # %d is the token of integers
... 
value   a - num of occurances = 1
value  ab - num of occurances = 1
value abc - num of occurances = 1

サイドノート:itertoolsモジュールの存在を知っているかどうか疑問に思いました。たとえば、次のコマンドを使用すると、すべての組み合わせのリストを1行で取得できます。

>>> [''.join(perm) for i in range(1, len(s)) for perm in it.permutations(s, i)]
['a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'ba', 'bc', 'bd', 'ca', 'cb', 'cd', 'da', 'db', 'dc', 'abc', 'abd', 'acb', 'acd', 'adb', 'adc', 'bac', 'bad', 'bca', 'bcd', 'bda', 'bdc', 'cab', 'cad', 'cba', 'cbd', 'cda', 'cdb', 'dab', 'dac', 'dba', 'dbc', 'dca', 'dcb']

combinations組み合わせて使用すると、発生数を取得できますcount()


24
負の数は左詰めの埋め込み出力を与えることをおそらく言及する必要があります。これは初心者にはほとんど直感的ではありません。
tripleee

@tripleeeの+1、負の数がない場合、左揃えのコメントを提供します。
ブリフォードワイリー2014

これは、新しいstr.formatよりもはるかに直感的で簡潔です。pythonで畳み込みへのこのプッシュがある理由がわかりません
scottmrogowski '06 / 06/06

空白を特定の文字で埋める方法はありますか?たとえば、「5」ではなく「05」を印刷する必要がある場合
Harshit Jindal

1
Mediumでf-stringsを使用したエレガントな固定幅印刷のためのいくつかのトリックを次に示します。
pfabri

197

私はstr.formatはるかにエレガントな使用を見つけます:

>>> '{0: <5}'.format('ss')
'ss   '
>>> '{0: <5}'.format('sss')
'sss  '
>>> '{0: <5}'.format('ssss')
'ssss '
>>> '{0: <5}'.format('sssss')
'sssss'

文字列を正しい位置に揃えたい場合>は、<次の代わりに使用します。

>>> '{0: >5}'.format('ss')
'   ss'

編集:コメントで述べたように、0はに渡される引数のインデックスを示しますstr.format()


5
さらに、0はフォーマット引数の位置を示すので、他の2つのことを行うことができます。 '{<5}'.format('ss') 'ss '以前と同じように、ただし0なしで同じことを行うか 'Second {1: <5} and first {0: <5}'.format('ss', 'sss') 'Second sss and first ss '、同じ変数を1回の出力で何度も並べ替えたり、出力したりできます。ストリング。
mightypile 2013

14
以前のコメントが必要なため、編集できなくなりました。{<5}機能しませんが{: <5}、インデックス値がなくても機能します。
マイティパイル2013

9
以下は、これらのフォーマット文字列と追加オプションを説明するPython フォーマット仕様のミニ言語です。クイックリファレンスとして、のスペース{0: <5}[fill]<is [align]5isです[width]
cod3monk3y 2014年

2
その5は変数の置換である可能性があります>>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('\n') ['ssssss '] >>>
user2763554

4
数値を使用して、変数を順番に並べることもできますwidth=10; "{0: <{1}}".format('sss', width)。または、数字を'{: <{}}'.format('sss', width)
省い

71

元々は@ 0x90の回答の編集として投稿されましたが、投稿の元の意図から逸脱しているために拒否され、コメントまたは回答として投稿することをお勧めしました。

@ 0x90からの回答に加えて、(@ user2763554のコメントに従って)幅に変数を使用することにより、構文をより柔軟にすることができます。

width=10
'{0: <{width}}'.format('sss', width=width)

さらに、数値のみを使用して、に渡される引数の順序に依存することにより、この式を簡潔にすることができますformat

width=10
'{0: <{1}}'.format('sss', width)

または、最大で潜在的に非Python的に暗黙的でコンパクトにするために、すべての数値を省略します。

width=10
'{: <{}}'.format('sss', width)

2017-05-26の更新

Python 3.6 でフォーマットされた文字列リテラル(略して "f-strings")の導入により以前に定義された変数に簡単な構文でアクセスできるようになりました。

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'

これは文字列のフォーマットにも適用されます

>>> width=10
>>> string = 'sss'
>>> f'{string: <{width}}'
'sss       '

私はこの答えが一番好きです!
Syrtis Major

10

format間違いなく最もエレガントな方法ですが、Pythonのloggingモジュールではこれを使用できないので、%フォーマットを使用してこれを行う方法を次に示します。

formatter = logging.Formatter(
    fmt='%(asctime)s | %(name)-20s | %(levelname)-10s | %(message)s',
)

ここで、-は左揃えをs示し、前の数字は固定幅を示します。

いくつかの出力例:

2017-03-14 14:43:42,581 | this-app             | INFO       | running main
2017-03-14 14:43:42,581 | this-app.aux         | DEBUG      | 5 is an int!
2017-03-14 14:43:42,581 | this-app.aux         | INFO       | hello
2017-03-14 14:43:42,581 | this-app             | ERROR      | failed running main

詳細はこちらのドキュメント:https : //docs.python.org/2/library/stdtypes.html#string-formatting-operations


ただし、20文字を超える文字列は短縮されません。'%(name)20.20s'ストリングの長さの最小値と最大値の両方として20を設定するものを使用してください!
xjcl

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