SW/리눅스

Python : 문자열 뒤집기 : 방법, 예제, 명령어

얇은생각 2023. 1. 29. 07:30
반응형

Python에서 문자열은 유니코드 문자의 시퀀스입니다. Python은 문자열 조작을 위한 수많은 함수를 지원하지만, 문자열을 반전시키기 위해 명시적으로 설계된 내장 함수나 메서드는 없습니다.

'tistory'.reverse()

# Traceback (most recent call last):
# File "<input>", line 1, in <module>
# AttributeError: 'str' object has no attribute 'reverse'

 

 

문자열 역전은 프로그래밍에서 일반적인 작업이 아니며 일반적으로 코딩 인터뷰에 사용됩니다.

Python에서 문자열을 반전하는 여러 가지 방법을 설명합니다.

 

 

 

슬라이싱을 사용

문자열 슬라이스 작업을 수행하려면 Python에서 인덱싱이 작동하는 방식을 이해하는 것이 중요합니다. 일반적으로 인덱스 번호는 문자열 내의 특정 문자에 액세스하는 데 사용됩니다.

인덱싱에는 양의 인덱싱과 음의 인덱싱의 두 가지 유형이 있습니다.

 

Python : 문자열 뒤집기 : 방법, 예제, 명령어 1

 

 

n 문자에 액세스할 수 있습니다. 이 문자는 양의 인덱스 번호 2 또는 음의 인덱스 번호 -6을 통해 액세스할 수 있습니다.

>>> print('tistory'[2])

# s

>>> print('tistory'[-2])

# r

 

 

자르기 기술을 통해 문자열의 다양한 문자를 불러낼 수 있습니다. 슬라이싱은 주어진 문자열에서 하위 문자열의 시퀀스를 추출하는 작업입니다.

 

 조각 구문:

string[start:stop:step]

 

 

첫 번째 인수는 추출을 시작할 인덱스를 지정합니다. 음수 인덱스가 사용되는 경우 문자열 끝으로부터의 오프셋을 나타냅니다. 이 인수를 생략하면 인덱스 0부터 슬라이스가 시작됩니다.

두 번째 인수는 추출을 종료하기 전에 인덱스를 지정합니다. 결과에는 중지 요소가 포함되지 않습니다. 음수 인덱스가 사용되는 경우 문자열 끝으로부터의 오프셋을 나타냅니다. 이 인수가 생략되거나 문자열의 길이보다 클 경우, 슬라이스는 문자열의 끝으로 이동합니다.

세 번째 인수는 선택 사항이며 슬라이싱 단계를 지정합니다. step 인수를 사용하지 않으면 기본값은 1입니다. 음수 값이 사용되는 경우 슬라이스는 요소를 역순으로 가져옵니다.

문자열을 잘라낸 결과는 추출된 요소를 포함하는 새 문자열이며 원래 문자열은 수정되지 않습니다.

슬라이싱을 사용하여 문자열을 반전하려면 시작 및 중지 인수를 생략하고 -1의 음수 단계 증분을 사용합니다.

-1의 음수 단계 증가는 슬라이싱이 마지막 요소에서 시작하여 첫 번째 요소에서 끝나서 거꾸로 된 문자열이 발생한다는 것을 의미합니다.

print('tistory'[::-1])

# yrotsit

 

 

또한 사용자 정의 함수를 정의하고 이를 사용하여 문자열을 반전시킬 수도 있습니다.

def rev_str_thru_slicing(str_):
    return str_[::-1]

INPUT_STRING = "tistory"

if __name__ == '__main__':
    print("INPUT STRING -", INPUT_STRING)
    print("REVERSED STRING -", rev_str_thru_slicing(INPUT_STRING))

# Input String - tistory
# Reversed String using Slicing - yrotsit

 

 

reserved() 함수

기본 제공 reserved() 함수는 문자열 항목을 역순으로 처리하고 역방향 반복자를 반환합니다.

아래 예제에서는 join() 연산자를 사용하여 역방향 반복자의 요소가 빈 문자열에 추가됩니다.

def rev_str_thru_join_revd(STR):
    return "".join(reversed(STR))	

INPUT_STRING = "tistory" 

if __name__ == '__main__':

    print("INPUT STRING -", INPUT_STRING)
    print("RESERVED STRING THROUGH JOIN & REVERSED", rev_str_thru_join_revd(INPUT_STRING))

# Input String - tistory
# Reserved String Through Join & Reserved Methods - yrotsit

 

 

 

reverse()을 사용

list reverse() 메서드로 문자열을 반전하려면 먼저 목록 생성자를 사용하여 문자열을 목록으로 변환해야 합니다. 그런 다음 목록 항목은 reverse() 메서드를 사용하여 반대로 배치되고 마지막으로 join() 메서드를 사용하여 문자열로 결합됩니다.

다음은 예입니다.

def rev_str_thru_list_reverse(STR):
    lst = list(STR)
    lst.reverse()
    return(''.join(lst))
 
INPUT_STRING = "tistory"
 
if __name__ == '__main__':
    print("Input String -", INPUT_STRING)

print("Reserved String Through List", rev_str_thru_list_reverse(INPUT_STRING))

# Input String - tistory
# Reserved String Through List Reverse Method - yrotsit

 

 

 

재귀 함수를 사용

파이썬에서 재귀 함수는 어떤 조건이 충족될 때까지 자신을 호출하는 함수입니다.

아래 코드 조각에서 rev_str_thru_recursion 함수는 문자열 길이가 0보다 클 때까지 자신을 호출합니다. 각 호출에서 문자열은 잘라지고 첫 번째 문자만 남습니다. 나중에, 그것은 잘린 문자와 연결됩니다.

def rev_str_thru_recursion(STR):
    if len(STR) == 0:
         return STR
    else:
        return rev_str_thru_recursion(STR[1:]) + STR[0]

INPUT_STRING = "tistory"

if __name__ == '__main__':
    print("INPUT STRING -", INPUT_STRING)

print("RESERVED STRING THROUGH RECURSION", rev_str_thru_recursion(INPUT_STRING))

 

 

 

비교 분석

이 섹션에서는 이러한 네 가지 정의된 방법을 간단하게 비교하여 효율성을 확인할 것입니다. "timeit"이라는 파이썬 모듈을 사용하여 성능을 분석할 것입니다.

코드 조각의 실행에 걸리는 시간을 제공합니다. "timeit" 모듈의 "time it" 옵션은 코드 실행을 백만 번 반복하는 데 도움이 됩니다. 우리는 코드 스니펫을 백만 번 실행함으로써 출력을 평균 시간으로 이해할 수 있습니다.

 

Slicing 0.23 1x
List Reverse 1.63 7x
Join & Reserved 1.73 7.5x
Recursion 19.19 83x

 

위의 표를 보면 슬라이싱 방법이 List Reverse 방식보다 7, Join & Reserved 방식보다 7.5, 재귀 방식보다 83배 더 빠르다는 것을 알 수 있습니다. 그래서 슬라이싱은 줄을 거꾸로 돌리는 가장 빠르고 좋은 방법입니다.

 

Python : 문자열 뒤집기 : 방법, 예제, 명령어 2

 

 

위의 결과는 동일한 환경에서 문자열을 반전시키기 위해 논의된 방법을 비교 분석한 것입니다. 컴퓨터 환경에 따라 수치가 달라질 수 있지만 비율은 그대로 유지될 것입니다.

if __name__ == "__main__":

    ## Performance Calculation

    import timeit
    from statistics import mean

    s = INPUT_STRING * 10
    repeatCount = 100

    SLICING_PERF = timeit.repeat(lambda: rev_str_thru_slicing(s), repeat=repeatCount)
    print(min(SLICING_PERF), mean(SLICING_PERF), max(SLICING_PERF), SLICING_PERF)

    J_R_PERF = timeit.repeat(lambda: rev_str_thru_join_revd(s), repeat=repeatCount)
    print(min(J_R_PERF), mean(J_R_PERF), max(J_R_PERF), J_R_PERF)

    LIST_PERF = timeit.repeat(lambda: rev_str_thru_list_reverse(s), repeat=repeatCount)
    print(min(LIST_PERF), mean(LIST_PERF), max(LIST_PERF), LIST_PERF)

    RECUR_PERF = timeit.repeat(lambda: rev_str_thru_recursion(s), repeat=repeatCount)
    print(min(RECUR_PERF), mean(RECUR_PERF), max(RECUR_PERF), RECUR_PERF)

 

 

Python에는 문자열을 반전시키는 기능이 내장되어 있지 않지만 다른 방법을 사용하여 문자열을 반전시킬 수 있습니다. 회귀 검정 분석 결과, 절편 방법이 문자열을 반전시키는 가장 빠른 방법인 것으로 나타났습니다.

반응형