Python
python3

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

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

はじめに

文字列内の文字を変換したり削除したい時、1文字だけならstr.replace()を使ってもいいのですが、複数の文字を変換したいときは面倒です。
こんなときには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()を使いましょう。

参考