Help us understand the problem. What is going on with this article?

文字の変換には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()を使いましょう。

参考

tag1216
Qiita戦闘力はキュイレベルです! /作ったもの ◆QiiTrend:https://qiitrend.herokuapp.com/ ◆Qiiner:https://qiiner.tag1216.net/ ◆Qiitaでいいねしたら草生えるページ:https://qiiner.tag1216.net/likes-heatmap
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした