Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ฟังก์ชัน maketrans() และ translate() ใน Python

เมธอด 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() ใช้ตารางนั้นทำการแทนที่/ลบตัวอักษรในสตริงได้อย่างมีประสิทธิภาพ