Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのmaketrans()とtranslate()関数の使い方を徹底解説

Pythonの文字列メソッド maketrans()とは

maketrans()メソッドは、translate()メソッドで利用できる変換(マッピング)テーブルを作成するための静的メソッドです。1つの文字に対して、その変換・置換後の文字への1対1のマッピングを生成します。このメソッドは、各文字をUnicode表現に変換したうえでマッピングテーブルを作成します。

maketrans()メソッドの構文は以下のとおりです。

string.maketrans(x[, y[, z]])
y と z は省略可能な引数です。

maketrans()のパラメータ

maketrans()メソッドには3つのパラメータがあります。

x ― 引数が1つだけ渡された場合は、辞書を指定する必要があります。この辞書には、1文字の文字列からその変換先へのマッピング、またはUnicode番号('a'なら97)からその変換先へのマッピングが含まれている必要があります。

y ― 引数が2つ渡された場合は、同じ長さの2つの文字列を指定します。1番目の文字列の各文字が、2番目の文字列の対応するインデックス位置の文字に置き換えられます。

z ― 引数が3つ渡された場合、3番目の引数に含まれる各文字はNone(削除対象)にマッピングされます。

maketrans()の戻り値

このメソッドは、Unicode序数からその変換・置換先への1対1のマッピングを持つ変換テーブルを返します。

例1:辞書を使った変換テーブルの作成

maketrans()に辞書を渡して変換テーブルを作成する例です。

dict = {"a": "123", "b": "456", "c": "789"}
my_string = "abc"
print(my_string.maketrans(dict))

# Unicode番号をキーにした例
dict = {97: "123", 98: "456", 99: "789"}
my_string = "abc"
print(my_string.maketrans(dict))

出力結果

{97: '123', 98: '456', 99: '789'}
{97: '123', 98: '456', 99: '789'}

解説: この例では、辞書dictに文字「a」「b」「c」がそれぞれ「123」「456」「789」へマッピングされています。maketrans()は文字のUnicode序数をキーとして、対応する変換先へのマッピングを作成します。そのため、97('a')→'123'、98('b')→'456'、99('c')→'789'という結果になります。

例2:2つの文字列を使った変換テーブルの作成

maketrans()に同じ長さの2つの文字列を渡して変換テーブルを作成する例です。

my_string1 = "abc"
my_string2 = "def"
string = "abc"
print(string.maketrans(my_string1, my_string2))

# 長さが異なる場合の例
my_string1 = "abc"
my_string2 = "defghi"
string = "abc"
print(string.maketrans(my_string1, my_string2))

出力結果

{97: 100, 98: 101, 99: 102}
ValueError: the first two maketrans arguments must have equal length

解説: この例では、同じ長さの2つの文字列「abc」と「def」が定義され、対応する変換テーブルが作成されます。97('a')→100('d')、98('b')→101('e')、99('c')→102('f')のように、1番目の文字列の各文字のUnicode序数が、2番目の文字列の同じインデックス位置の文字へ1対1でマッピングされます。

一方、長さが異なる文字列で変換テーブルを作成しようとすると、「最初の2つの引数は同じ長さでなければならない」ことを示すValueError例外が発生します。

translate()メソッドとの組み合わせ

translate()メソッドは、変換テーブルを使って文字列内の複数の文字置換を一度に行うために使用します。まずmaketrans()で変換テーブルを作成し、それをtranslate()に渡すのが基本的な流れです。

maketrans()とtranslate()を使用したプログラム例

# maketransとtranslateを使用するPythonプログラム
dict = str.maketrans("abc", "def")
print(dict)

# この値を変換する
value = "aabbcc"
result = value.translate(dict)
print(result)

出力結果

{97: 100, 98: 101, 99: 102}
ddeeff

文字を削除するプログラム例

第3引数を指定すると、その文字を削除対象として扱えます。

# 変換テーブルを作成
table = str.maketrans("78", "12", "9")

# 文字列を変換
input = "123456789"
result = input.translate(table)

# 結果を出力
print(input)
print(result)

出力結果

123456789
12345612

ROT13変換を適用するプログラム例

# 変換テーブルを作成
trans = str.maketrans("abcdefghijklmnopqrstuvwxyz",
                      "nopqrstuvwxyzabcdefghijklm")

# ROT13変換を適用
print("gandalf".translate(trans))
print("gandalf".translate(trans).translate(trans))

出力結果

tnaqnys
gandalf

ROT13はアルファベットを13文字ずらすシンプルな暗号方式です。2回適用すると元の文字列に戻るため、「gandalf」→「tnaqnys」→「gandalf」という結果になります。このようにmaketrans()とtranslate()を組み合わせれば、文字置換だけでなく文字の削除や簡易的な暗号化処理も簡単に実装できます。

  1. Pythonのtranslate()メソッドで文字列を一括置換・翻訳する方法

    Pythonでは、文字列内の複数の文字をまとめて別の文字に置き換えたい場合、translate()メソッドを使うと効率的です。このメソッドは、str.maketrans()関数で作成した変換テーブルに基づいて文字を変換した新しい文字列のコピーを返します。また、オプションとして削除したい文字を指定すれば、該当する文字をすべて取り除くことも可能です。基本的な使い方以下の例では、母音「aeiou」をそれぞれ数字「12345」に対応付けて文字列を変換しています。intab = aeiou outtab = 12345 trantab = str.maketrans(intab, outtab) st

  2. Pythonの関数がハッシュ可能な理由とその仕組みを徹底解説

    ハッシュ可能(hashable)とは何か? オブジェクトが「ハッシュ可能」であるとは、その生存期間中にハッシュ値が変化しないことを意味します。具体的には、__hash__() メソッドを持っていることに加えて、他のオブジェクトとの比較が可能である必要があります。この比較には __eq__() または __cmp__() メソッドが用いられます。 重要なルールとして、比較した結果「等しい」と判定されたハッシュ可能なオブジェクト同士は、必ず同じハッシュ値を持たなければなりません。 ハッシュ可能性が重要な理由 ハッシュ可能であることは、そのオブジェクトを辞書(dict)のキーや集合(set)の要素