この記事は 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文字ずつ取得して変換テーブルを使って文字を変換していく
table = {
'、': ',',
'。': '.',
'・': '',
}
result = ''.join(table.get(c, c) for c in text)
str.translate()を使って書いた場合
str.translate()を使う場合は次のような手順になります。
- str.maketrans()でstr.translate()に使える変換テーブルを作成する
- 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()
を使いましょう。
参考
- Python3 ドキュメント
- ライブラリーリファレンス