読者です 読者をやめる 読者になる 読者になる

唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

Pythonの文字列中の変数展開(str.format)のメモ

Python

Pythonで文字列中の変数展開をするときの書式について調べたのでメモ

基本的に文字列中の{と}の間にいろいろと指定して、展開したい変数をformat関数に与えるようになっています
ちなみにformat関数を使っている時に、{や}の文字を普通に書きたいときには{{や}}のように波カッコを2つ重ねます

フィールドの指定

まずどの場所をどの値で置換するかの指定方法を説明します
基本的にはこの機能を覚えておけば十分のはずです

単純な使い方

{}をformat関数に与えた順番に置換する

print '{}, {}, {}'.format(1, 2, 3)
1, 2, 3

添字による指定

{}内に添字を書くとformat関数に与えた引数の何番目かを指定できる

print '{2}, {1}, {0}, {2}'.format(1, 2, 3)
3, 2, 1, 3

キーワード引数

キーワード引数として与えた名前を{}内に指定して参照できます

print '{a}, {b}, {c}, {a}'.format(a=1, b=2, c=3)
1, 2, 3, 1

辞書をアンパックすることで辞書のキーを使うこともできます

hoge = {'a': 1, 'b': 2, 'c': 3}
print '{a}, {b}, {c}, {a}'.format(**hoge)
1, 2, 3, 1

リストやタプル、辞書の要素の指定

[]を{}の中に書くことで要素の指定もできます
{0[0]}は0番目にformatに与えた引数の0番めの要素を示しています

print '{0[2]}, {0[1]}, {0[0]}, {1[a]}, {1[b]}, {1[c]}'.format([1, 2, 3], {'a': 1, 'b': 2, 'c': 3})
3, 2, 1, 1, 2, 3

もちろんキーワード引数などと組み合わせることもできます

print '{array[2]}, {array[1]}, {array[0]}'.format(array = [1, 2, 3])

オブジェクトの属性による指定

リストと同様にオブジェクトの属性による指定もできます
{0.x}とすると0番目の引数のx属性が出力されます

import collections

Point = collections.namedtuple('Point', 'x y')
p = Point(1, 2)
print '{0.x}, {0.y}'.format(p)
1, 2

値の表現方法の指定

これ以降はどのように値で置換するのかという方法を指定していきます
フィールドの指定などの後に:をつけてその後ろに指定します
機能が多くてわかりづらいので使いそうなやつだけ紹介します

指数表示

print '{:e}'.format(12345678)
1.234568e+07

パーセント表示

print '{:%}'.format(0.025)
2.500000%

2進数、8進数、16進数

print '{0:b}, {0:o}, {0:x}, {0:X}'.format(10)
1010, 12, a, A

#をつけると数値の前に0xなどのプレフィックスが付けられます

print '{0:#b}, {0:#o}, {0:#x}, {0:#X}'.format(10)
0b1010, 0o12, 0xa, 0XA

小数点以下の桁数

.桁数で小数点以下の桁数を指定できます
出力のタイプにfを指定した場合には固定小数点数、eを指定した場合には指数表示になおして表示します

print '{0:.2f}, {0:.2e}'.format(12345678)
12345678.00, 1.23e+07

カンマ(,)

print '{:,}'.format(12345678)
12,345,678

その他の値の表現方法の指定

↑によると一般的な書式指定の形式は[[fill]align][sign][#][0][width][,][.precision][type]となっています
上では[#][,][.precision]と[type]の一部について紹介しました
紹介した以外にも符号の表示の仕方の指定や右寄せ左寄せなどの指定ができます

左側を0で埋める方法(ゼロパディング)について書いていなかったので追記

02のように数値がない部分を0で埋めたい場合には「0」の後に「文字数」をつなげて出力のタイプの前に書けばよいです
指定した文字数未満の時、残りが0で埋められます

print '{0:05d}, {0:05b}, {0:05o}, {0:05x}, {0:05X}'.format(10)
00010, 01010, 00012, 0000a, 0000A

指定するのは桁数ではなく出力される文字数なので、プレフィックスをつけたり浮動小数を出力させると、表示される数値の桁は変わってしまうので注意

print '{0:#05b}, {0:#05o}, {0:#05x}, {0:#05X}, {0:05.2f}, {0:010.2e}'.format(10)
0b1010, 0o012, 0x00a, 0X00A, 10.00, 001.00e+01
-->