문자열을 그대로 뒤집어야 하는 상황이 있지요? slice 사용법, reversed, reverse를 사용하는 방법, for loop을 활용한 방법, 이렇게 Python 문자열 뒤집기 4가지 방법은 각각 살펴보고 성능을 비교해 보겠습니다.
목차
문자열 뒤집기 slice 활용법
문자열을 뒤집는 건 문자열[::-1]을 활용하는 방법입니다. 문자열을 자를 때와 비슷해 보이죠? 콜론이 하나 더 있습니다. 마지막은 step의 의미입니다. step을 -1로 주면 반대 방향으로 한 글자씩 가져오게 됩니다.
txt = '11일 승률 43.234% David'
print(txt[::-1])
Python이번에는 step을 다양하게 활용해 보겠습니다. Line 2에서는 아래 문자열에서 홀수만 얻어오겠습니다. 그리고 Line 3에서는 짝수만도 얻어보겠습니다. Line 4에서는 홀수를 뒤집어서 얻어보기도 해보겠습니다. Line 5에서는 짝수를 뒤집어서 얻어보겠습니다.
txt = "12345678"
print(txt[::2])
print(txt[1::2])
print(txt[-2::-2])
print(txt[-1::-2])
Pythonjoin()과 reversed() 사용하기
reversed()는 문자열이나 리스트의 순서를 뒤집어 주는 역할을 합니다. 리턴되는 값은 reversed 객체입니다. 좀 독특한 녀석입니다. reversed 객체를 next()로 감싸면 값을 하나씩 얻어올 수 있습니다.
txt = '12345678'
print(''.join(reversed(txt)))
Python또는 아래의 코드처럼 for loop와 함께 사용하면 조금 더 편하게 사용할 수 있습니다.
txt = '12345678'
for item in reversed(txt):
print(item, end="")
Python원본 문자열 뒤집기
원본 문자열의 순서를 아예 바꿔주는 list 객체의 reverse 메서드가 있습니다. 문자열 뒤집기 문서이지만 list와도 관련성이 없지는 않아서 함께 다루어 보겠습니다.
문자열의 경우에는 list로 바꿔주고, reverse를 해 준 후, 다시 join을 이용해서 문자열로 합쳐줘야 해서 좀 번거롭긴 하네요. reverse() 메서드의 특징은 별도의 리턴 값이 존재하지 않고, 입력값 자체를 바꿔주는 것이 위의 reversed()와는 다른 점입니다.
txt = '12345678'
list_txt = list(txt)
list_txt.reverse()
print(''.join(list_txt))
Python직접 코딩해서 바꿔주기
문자열 붙이는 순서를 조작해서 문자열 뒤집는 방법입니다.
txt = '12345678'
result = ''
for char in txt:
result = char + result
print(result)
Python직접 문자열의 인덱스에 접근해서 문자열을 뒤집는 방법입니다.
print(''.join([txt[i] for i in range(len(txt) - 1, -1, -1)]))
Python여기까지 Python 문자열 뒤집기 방법을 모두 알아보았습니다.
Python 문자열 뒤집기 성능 비교
문자열을 뒤집는 다양한 방법이 있는데, 어떤 것이 성능상 가장 빠를까요? print()로 출력하지 않고 값을 변환해서 완성된 문자열로 바꾸는 것까지의 결과를 확인해 보겠습니다. 아래에 테스트한 코드가 있습니다.
import timeit
# slice
def func_a():
return txt[::-1]
# join & reversed
def func_b():
return ''.join(reversed(txt))
# reversed only
def func_b2():
return reversed(txt)
# convert list and reverse and join
def func_c():
list_txt = list(txt)
list_txt.reverse()
return ''.join(list_txt)
# convert list and reverse
def func_c2():
list_txt = list(txt)
return list_txt.reverse()
# reverse only
def func_c3():
return listed_txt.reverse()
# for loop 1
def func_d():
result = ''
for char in txt:
result = char + result
return result
# for loop 2 - range()
def func_e():
return ''.join([txt[i] for i in range(len(txt) - 1, -1, -1)])
txt = "abcdefghijklmnopqrstuvwxyz1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ가나다라마바사아자차카타파하"
listed_txt = list(txt)
print("%8s %.6f" % ("func_a:", timeit.timeit(func_a, number=100000)))
print("%8s %.6f" % ("func_b:", timeit.timeit(func_b, number=100000)))
print("%8s %.6f" % ("func_b2:", timeit.timeit(func_b2, number=100000)))
print("%8s %.6f" % ("func_c:", timeit.timeit(func_c, number=100000)))
print("%8s %.6f" % ("func_c2:", timeit.timeit(func_c2, number=100000)))
print("%8s %.6f" % ("func_d:", timeit.timeit(func_d, number=100000)))
print("%8s %.6f" % ("func_e:", timeit.timeit(func_e, number=100000)))
Python위에서 언급한 내용을 가지고 모두 10만 번씩 실행하는 데 시간이 얼마나 드는지 timeit 패키지를 사용해서 확인해 보았습니다. 문자열을 문자열로 되돌려 받는 것은 Slice를 이용한 func_a가 약 10ms로 가장 빨랐습니다. 특히 직접 for loop을 돌려서 처리하는 func_d와 func_e가 약 201ms 가량으로 가장 느린 것을 볼 수 있습니다.
흥미로운 지점이 있는데, 그건 바로 문자열을 reversed 객체로 돌려받는 방법을 적용한 func_b2는 약 4.9ms로 매우 빨랐으며, 그리고 리스트 객체 자체를 뒤집어주는 reverse 메서드를 사용한 func_c3가 약 4.5ms로 가장 빠른 속도를 보여줬습니다.
리스트를 뒤집는 건 reverse가 가장 빨랐으나, 원본을 보존해야 하는 경우에는 사용할 수 없습니다. 원본을 보존해야 할 땐 reversed 메서드를 사용하면 가장 빠른 처리가 가능하겠습니다.
데이터가 몇 개 안 돼서 큰 문제가 안 될 때야 상관없겠지만, 다량의 데이터를 처리할 땐 위의 성능 테스트 다시 찾아보시고 활용하시면 도움이 되실 거예요. 여기까지 Python 문자열 뒤집기 방법 4가지와 각각의 성능 차이가 얼마나 나는지 함께 살펴보았습니다. 궁금하셨던 분들께 도움이 되길 바랍니다.
관련 자료
Python 문서 Strings를 참고했습니다.