Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 maketrans()와 translate() 함수 완벽 정리


파이썬 문자열 maketrans()

maketrans() 메서드는 translate() 메서드에서 사용할 수 있는 변환(translation) 매핑 테이블을 반환합니다. 이 메서드는 문자와 그에 대응하는 치환 문자를 일대일(one-to-one)로 매핑하는 정적(static) 메서드이며, 각 문자를 유니코드 표현으로 변환하여 번역용 테이블을 생성합니다.

maketrans() 메서드의 기본 문법은 다음과 같습니다.

string.maketrans(x[, y[, z]])
y와 z는 선택적(optional) 인자입니다.

maketrans()의 매개변수

maketrans() 메서드는 총 3개의 매개변수를 가질 수 있습니다.

x − 인자가 하나만 전달되는 경우, 반드시 딕셔너리여야 하며 이 딕셔너리는 단일 문자열에서 해당 치환 값으로의 일대일 매핑 또는 유니코드 숫자(예: 'a'는 97)에서 치환 값으로의 매핑을 포함해야 합니다.

y − 두 개의 인자가 전달되는 경우, 길이가 같은 두 개의 문자열이어야 하며 첫 번째 문자열의 각 문자는 두 번째 문자열에서 동일한 인덱스에 있는 문자로 대체됩니다.

z − 세 개의 인자가 전달되는 경우, 세 번째 인자의 각 문자는 None(제거 대상)으로 매핑됩니다.

maketrans()의 반환값

이 메서드는 유니코드 서수(ordinal)와 그에 해당하는 치환 값 사이의 일대일 매핑을 담은 변환 테이블을 반환합니다.

예제 1: 딕셔너리를 사용한 변환 테이블

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

# 유니코드 숫자를 키로 사용하는 예제
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'}

설명 − 위 예제에서 딕셔너리는 문자 a, b, c를 각각 '123', '456', '789'에 매핑합니다. maketrans()는 각 문자의 유니코드 서수를 해당 치환 값에 연결하므로, 결과적으로 97('a')은 '123'에, 98('b')은 '456'에, 99('c')은 '789'에 매핑된 테이블이 생성됩니다. 문자를 직접 키로 사용하든 유니코드 숫자를 키로 사용하든 결과는 동일합니다.

예제 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

설명 − 첫 번째 예제에서는 길이가 같은 두 문자열 "abc"와 "def"가 정의되어 있습니다. 이때 생성되는 변환 테이블은 첫 번째 문자열의 각 문자 유니코드 서수를 두 번째 문자열의 동일한 인덱스 위치 문자에 일대일로 매핑합니다. 즉, 97('a')은 100('d')에, 98('b')은 101('e')에, 99('c')은 102('f')에 매핑됩니다.

반면 두 문자열의 길이가 다르면 ValueError 예외가 발생하며, 이는 maketrans()의 처음 두 인자는 반드시 길이가 같아야 한다는 것을 의미합니다.


translate() 함수란?

translate() 메서드는 앞서 만든 변환 테이블을 기반으로 문자열 내에서 여러 문자를 한 번에 치환할 때 사용합니다. 먼저 maketrans()로 변환 테이블(딕셔너리)을 만들고, 이를 translate()에 전달하는 방식으로 활용합니다.

maketrans와 translate를 함께 사용하는 예제

# maketrans와 translate를 함께 사용하는 프로그램
dict = str.maketrans("abc", "def")
print(dict)

# 문자열 치환 적용
value = "aabbcc"
result = value.translate(dict)
print(result)

실행 결과

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

위 예제에서 "aabbcc"의 모든 a는 d로, b는 e로, c는 f로 한 번에 치환되어 "ddeeff"가 출력됩니다.

특정 문자 제거하기

maketrans()의 세 번째 인자를 활용하면 특정 문자를 삭제할 수도 있습니다.

# 세 번째 인자로 제거할 문자 지정
table = str.maketrans("78", "12", "9")

# 문자열에 변환 적용
input = "123456789"
result = input.translate(table)

print(input)
print(result)

실행 결과

123456789
12345612

위 예제에서는 7이 1로, 8이 2로 치환되고, 세 번째 인자로 지정된 9는 문자열에서 완전히 제거됩니다.

rot13 암호화 적용 예제

maketrans()translate()를 조합하면 rot13과 같은 고전 암호도 손쉽게 구현할 수 있습니다.

# rot13 변환 테이블 생성
trans = str.maketrans("abcdefghijklmnopqrstuvwxyz", "nopqrstuvwxyzabcdefghijklm")

# rot13 변환 적용
print("gandalf".translate(trans))
print("gandalf".translate(trans).translate(trans))

실행 결과

tnaqnys
gandalf

rot13은 알파벳을 13글자씩 밀어내는 방식이며, 같은 변환을 두 번 적용하면 원래 문자열로 되돌아오는 특징이 있습니다. 위 결과에서 "gandalf"가 "tnaqnys"로 변환되고, 다시 한 번 변환하면 원래의 "gandalf"로 복원되는 것을 확인할 수 있습니다.