Python Len関数でformatの文字数を指定する
タイトルだけ見て、先に結論知りたい方のために、先にコードを書いておくと下記のとおりです。(解説は後半にまとめます)
コード例(#が実行結果)
文字列「namamuginamagome」の長さに合わせて、「-」で装飾した「end」を書く例です。
(1)
width = 'namamuginamagome'
print('{:-^{}}'.format('end', len(width)))
# ------end-------
もう少し丁寧に書くと、こうなります。
(2)
width = 'namamuginamagome'
print('{message:-^{long}}'.format(message = 'end', long=len(width)))
# ------end-------
変数を外にだして、フォーマット済み文字列リテラルの仕組みでシンプルにするとこうなります。
(3)
width = 'namamuginamagome'
message = 'end'
print(f'{message:-^{len(width)}}')
# ------end-------
これを利用して作った関数。入力した文字長に合わせて、「---end---」が表示されます。
(4)
def test(input):
message = 'end'
print(input)
print(f'{message:-^{len(input)}}')
test("this is test message")
# this is test message
# --------end---------
応用すると複数行の中で最も長い文字列に合わせて表示できます。
(5)
sentence = ['this is test', 'that is test too', 'what is test?']
def multi(strList):
message = 'end'
n = []
for value in strList:
print(value)
n.append(len(value))
print(f'{message:-^{max(n)}}')
multi(sentence)
# this is test
# that is test too
# what is test?
# ------end-------
解説編1:format構文おさらい
formatの構文は次の通りです。
(6)
print('{}'.format())
使用例は次のようになります。
(7)
print('好きな食べ物は{}です'.format('りんご'))
# 好きな食べ物はりんごです
{ }を使用して、そこにいれる値を外に出します。
複数ある場合は、次のように書くことができます。
(8)
print('天気は{weather}、気温は{temp}度'.format(weather='晴れ',temp='18'))
# 天気は晴れ、気温は18度
また、文字数を指定して右寄せやセンタリングもできます。
(9)
print('天気{weather:<10}'.format(weather='晴れ'))
# 天気晴れ
print('天気{weather:^10}'.format(weather='晴れ'))
# 天気 晴れ
print('天気{weather:>10}'.format(weather='晴れ'))
# 天気 晴れ
{ }の中で、コロンの前は.format以降の外だしの部分への紐づけ、コロンよりあとは位置指定と文字数指定です。
< 左寄せ
^ センタリング
> 右寄せ
さらに、位置指定文字の前に何かしらの文字を入れると、その文字で装飾されます。
(10)
print('天気{weather:-^10}'.format(weather='晴れ'))
# 天気----晴れ----
print('天気{weather:Z^10}'.format(weather='晴れ'))
# 天気ZZZZ晴れZZZZ
print('天気{weather:w<10}'.format(weather='晴れ'))
# 天気晴れwwwwwwww
文字数指定は、ここの例では「10」にしています。「^10」は「10文字分のスペースのうち、真ん中に寄せる」という意味になりますので
「□□□□晴れ□□□□」
という状態になっています。
(□は装飾する文字の指定がなければ空白)
この「10」を決め打ちではなく、Len関数を用いた変動式にしたいというのが、今回のテーマでした(ここにきてようやく今回のテーマ。。。)
解説編2:format内ではLen関数が打てない
ということで、上記の「10」のところを「Len(x)」にただ置き換えるだけでは機能しません。
(11)
# これはできないやつ
x = 'aiueoaiueo'
print('天気{weather:>len(x)}'.format(weather='晴れ'))
そこで、冒頭に示した結論の(1)に至るわけですが、ようするに、{}の中に{}を入れて、そこにLen関数を充てることになります。
(1)
width = 'namamuginamagome'
print('{:-^{}}'.format('end', len(width)))
# ------end-------
順を追うとこのようになります。
(12)
width = 'namamuginamagome'
print('{}').format('end'))
# end
print('{:^16}'.format('end')) # 16文字でセンタリングします
# end
print('{:^{}}'.format('end',len(width))) # 「16文字」をフォーマット化し、LEN関数で表現します
# end
print('{:-^{}}'.format('end',len(width))) # 「-」で装飾します。
# ------end-------
ここまで書けば、きっと(2)以降はわかるかと思いますので、この辺でお開きです。