เมธอด str.maketrans()
เมธอด maketrans() คืนค่าตารางการแปล (mapping table) ที่ใช้กับเมธอด translate() นี่คือเมธอดสแตติกที่สร้างการแมปпи้ง 1 ต่อ 1 ของตัวอักษรไปยังการแปล/การแทนที่ สร้างการแทนที่แบบ Unicode สำหรับแต่ละตัวอักษร
ไวยากรณ์
string.maketrans(x[, y[, z]])
y และ z เป็นอาร์กิวเมนต์ตัวเลือก
พารามิเตอร์ของ maketrans()
- x - หากระบุอาร์กิวเมนต์เดียว ต้องเป็นดิกชันนารีที่มีการแมปปิ้ง 1 ต่อ 1 จากสตริงตัวอักษรเดี่ยวไปยังการแปล หรือหมายเลข Unicode (เช่น 97 สำหรับ 'a') ไปยังการแปล
- y - หากระบุสองอาร์กิวเมนต์ ต้องเป็นสตริงสองสตริงที่มีความยาวเท่ากัน ตัวอักษรแต่ละตัวในสตริงแรกจะถูกแทนที่ด้วยตัวอักษรในตำแหน่งเดียวกันของสตริงที่สอง
- z - หากระบุสามอาร์กิวเมนต์ ตัวอักษรแต่ละตัวในอาร์กิวเมนต์ที่สามจะถูกแมปไปยัง None (คือจะถูกลบออก)
ค่าที่คืน
คืนค่าตารางการแปลที่มีการแมปปิ้ง 1 ต่อ 1 ของลำดับ Unicode ไปยังการแปล/การแทนที่
ตัวอย่างที่ 1: ใช้ดิกชันนารีกับ maketrans()
# ใช้สตริงเป็นคีย์
dict = {"a": "123", "b": "456", "c": "789"}
my_string = "abc"
print(my_string.maketrans(dict))
# ใช้ Unicode ordinal เป็นคีย์
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 ordinal ของตัวอักษรไปยังการแปลที่สอดคล้องกัน ดังนั้น 97 ('a') แมปไป '123', 98 ('b') ไป '456', 99 ('c') ไป '789'
ตัวอย่างที่ 2: ใช้สองสตริงกับ maketrans()
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
คำอธิบาย: กรณีแรก สองสตริงที่มีความยาวเท่ากัน "abc" และ "def" สร้างการแปลที่สอดคล้องกัน 97 ('a') แมปไป 100 ('d'), 98 ('b') ไป 101 ('e'), 99 ('c') ไป 102 ('f') กรณีที่สอง พยายามสร้างตารางแปลสำหรับสตริงความยาวไม่เท่ากัน จะเกิด ValueError
เมธอด translate()
เรารู้ว่าตารางการแปลแมปปิ้งตัวอักษรไปยังตัวอักษรอื่น เราใช้เมธอด translate() ใน Python สำหรับการแทนที่ตัวอักษรหลายตัวในสตริงพร้อมกัน ก่อนอื่นสร้างดิกชันนารีการแปลด้วย maketrans() แล้วส่งให้ translate()
ตัวอย่างโปรแกรมใช้ maketrans และ translate
# Python program that uses maketrans, translate
dict = str.maketrans("abc", "def")
print(dict)
# แปลค่านี้
value = "aabbcc"
result = value.translate(dict)
print(result)
ผลลัพธ์
{97: 100, 98: 101, 99: 102}
ddeeff
ตัวอย่าง: ลบ/ละเว้นตัวอักษร
# สร้างตารางการแปล: a->1, b->2, ลบ c
table = str.maketrans("ab", "12", "c")
# แปลสตริงนี้
input_str = "abcabc"
result = input_str.translate(table)
print(input_str)
print(result)
ผลลัพธ์
abcabc
1212
ตัวอย่าง: ใช้การเข้ารหัส ROT13
# สร้างตารางการแปลสำหรับ ROT13
trans = str.maketrans(
"abcdefghijklmnopqrstuvwxyz",
"nopqrstuvwxyzabcdefghijklm"
)
# ใช้การแปล ROT13
print("gandalf".translate(trans)) # เข้ารหัส
print("gandalf".translate(trans).translate(trans)) # ถอดรหัส (กลับคืนค่าเดิม)
ผลลัพธ์
tnaqnys
gandalf
สรุป: maketrans() สร้างตารางแมปปิ้ง และ translate() ใช้ตารางนั้นทำการแทนที่/ลบตัวอักษรในสตริงได้อย่างมีประสิทธิภาพ