147
107

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonのコードを短く簡潔に書くテクニックAdvent Calendar 2017

Day 11

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

Last updated at Posted at 2017-12-10

この記事は 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()を使いましょう。

参考

147
107
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
147
107

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?