pythonのstr.translate()は複数の置換を一発で行う便利なものだが、いろいろ実験してみた。
実験
以下のコードを作った。
a = {'a':'b'}
tbl = str.maketrans(a)
s1 = 'a b c d e f'
s2 = s1.translate(tbl)
print(s2)
結果は以下の通り
b b c d e f
次に以下でやってみた
a = {'a':'b','b':'a'}
:
:省略
結果は以下の通り。すべての条件を一度にやっている感じ。
b a c d e f
次に以下でやってみた
a = {'a':None,'b':'a'}
:
:省略
予想は” a c d e f”だが。結果は
a c d e f
次に以下でやってみた
a = {'a':'b','b':'cc','c':None}
:
:省略
予想は”b cc d e f”だが。結果は
b cc d e f
もし変換テーブルの左から順に行うと、
- a→b:b b c d e f
- b→cc:cc cc c d e f
- c→none: d e f
となるはず。変換テーブルの左から順にするのではなく、一度に変換する仕様だ。
str.maketransの返却値について
{‘a’:’b’,’b’:’cc’,’c’:None}の返却値は、以下の通り
{97: 'b', 98: 'cc', 99: None}
では、マルチバイト文字を入れてみるとどうなるか?
{'英':'b','b':'c','@':None}
結果は以下の通り。
{33521: 'b', 98: 'c', 65312: None}
Unicode序数に変換された。ちなみに以下のような書き方もでき、
str.maketrans('ab', 'xy')
結果は
{97: 120, 98: 121}
また、以下のようにすると
str.maketrans('abc', 'xy')
おこられた
print(str.maketrans('abc', 'xy'))
^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: the first two maketrans arguments must have equal length
この書き方の場合、同じ文字数同士にしろ、ということ。

