Edited at

文字の変換にはstr.translate()が便利

More than 1 year has passed since last update.

この記事は Pythonのコードを短く簡潔に書くテクニック Advent Calendar 2017 の11日目です。


はじめに

文字列内の文字を変換したり削除したい時、1文字だけならstr.replace()を使ってもいいのですが、複数の文字を変換したいときは面倒です。

こんなときにはstr.translate()を使うのが便利です。

str.translate()は変換テーブルを使って文字列を変換する関数です。

尚、str.translate()はPython2、Python3の両方で使用できますが、Python2ではstr型とunicode型での違いがあり複雑になるため、ここではPython3での使用方法のみ説明します。


例題

例えばこんな変換をしたい場合を考えてみます。

変換前
変換後


,


.


削除


変換前の文字列

Qiitaは、プログラミングに関する知識を記録・共有するためのサービスです。



変換後の文字列

Qiitaは,プログラミングに関する知識を記録共有するためのサービスです.



str.translate()を使わずに書いた場合

str.translate()を使わない場合は次のような手順になります。


  1. 変換テーブルとして変換前の文字と変換後の文字のマップを定義する

  2. 対象テキストを1文字ずつ取得して変換テーブルを使って文字を変換していく

table = {

'、': ',',
'。': '.',
'・': '',
}
result = ''.join(table.get(c, c) for c in text)


str.translate()を使って書いた場合

str.translate()を使う場合は次のような手順になります。



  1. str.maketrans()str.translate()に使える変換テーブルを作成する


  2. str.translate()で文字列内の文字を変換する

1.のstr.maketrans()は引数の指定方法が2通りあります。


  • 変換テーブルをdictで指定する

  • 変換前文字、変換後文字、削除対象文字(省略可)を指定する


変換テーブルをdictで指定する

table = str.maketrans({

'、': ',',
'。': '.',
'・': '',
})
result = text.translate(table)

2.の処理がスッキリしました。


変換前文字列、変換後文字列、削除対象文字列を指定する

table = str.maketrans('、。', ',.', '・')

result = text.translate(table)

1.の処理がだいぶスッキリしました。


処理時間の比較

2.を100万回繰り返した時の処理時間を比較してみました。

方法
処理時間 (s)

str.translate()を使わずに書いた場合
13.511

変換テーブルをdictで指定する
4.575

変換前文字列、変換後文字列、削除対象文字列を指定する
4.507


結論

str.translate()を使いましょう。


参考