python str.translate()について

未分類

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

この書き方の場合、同じ文字数同士にしろ、ということ。

タイトルとURLをコピーしました