안녕하세요. 이 글에서는 python 문자열 자르기에 대해서 간단하게 알아보겠습니다.

 


 먼저, 문자열 'abcdefg'가 있어요. 여기서 1번째 인덱스부터 2번째 인덱스까지 꺼내기 위해서 어떻게 하면 될까요? 2번째 줄을 보면 s[1:3]이라고 적었는데요. 이것은 1번째부터 2번째까지 뽑겠다는 의미입니다. 3번째는 포함하지 않아요.

 

 

 실행 결과는 위와 같습니다. 4번째 위치부터 끝까지 뽑으려면 어떻게 해야 할까요? s[4:len(s)] 이렇게 입력하면 될까요? 그럴 필요 없어요. 단지 s[4:] 이렇게만 입력하시면 됩니다.

 

 

 이것은 4번째 위치부터 끝까지 뽑겠다는 거에요. 그러면 'efg'가 print 될 거 같은데요. 정말 그런지 보겠습니다.

 

 

 정말 'efg'가 뽑혔어요. 처음부터 2번째 인덱스까지 뽑는다면 s[:3] 이렇게 입력하시면 되겠죠?

 


 문자열 자르기 연산은 단독으로 쓰이는 경우도 많지만, 다른 문자열 연산들하고 같이 쓰이는 경우가 많아요. 사실 슬라이싱은 기본 중의 기본 연산이니 그럴 법도 합니다. 이 글에서는 이 중에서, 문자열의 특정 index를 특정 문자로 바꾸는 연산을 다뤄보도록 하겠습니다.

 

 

 문자열의 특정 index 값을 바꿔 봅시다. 2번째 줄은 2번째 위치에 'C'를 assign 하는 것인데요.

 

 

 str object가 item assignment를 support 하지 않는다고 나와 있어요. 이 연산을 지원하지 않기 때문이에요. 사실 java의 string도 마찬가지입니다. 그래서, 부분 문자열들을 가지고 새로 조합을 할 수 밖에 없어요.

 

 

 그래서, 2번째 위치를 바꾸려면 s[:2]에다가 'C'에다가 s[3:]을 더해야 합니다. 이는 0번째 위치부터 1번째 위치까지의 부분 문자열인 'ab'와, 'C'와 3번째 위치부터 문자열 끝까지인 'defg'를 더한다는 의미입니다.

 

 

 실행 결과는 위와 같아요. 어렵지 않네요.

 


 그런데, index 번째 위치를 특정한 문자 값으로 바꾸는 연산을 매우 많이 한다면 비효율 적일 수 밖에 없어요. 문자열 길이가 100만이고, 이러한 point update 연산이 100만번 일어난다고 해 봅시다.

 

 

 4번째 줄을 보시면, 문자 하나와 s[1:]을 계속 가져와서 새롭게 문자열을 생성함을 볼 수 있는데요. 딱 봐도 for loop 한 번 돌 때 마다, O(|s|)만큼 걸릴 거 같아요. 상당히 비효율적입니다. 굳이 그럴 필요가 있을까 싶을 정도로요.

 

 

 시간이 너무 오래 걸려서 중간에 aborted가 되었습니다. 이런 연산이 많이 들어오는 경우에는 어떻게 해야 할까요? 자바에서 string + 연산이 많이 일어날 때 어떻게 했나요? stringBuilder로 바꿔서 처리했습니다. 마찬가지입니다. 문자열을 변경 가능한 mutable 특성을 가진, list로 변환해야 합니다.

 

 

 왜냐하면 list는 mutable하기 때문이에요. 그리고 list는 item assignment가 지원되는 구조입니다. 4번째 줄을 보시면, li[0]에 문자를 계속 집어넣고 있음을 알 수 있어요. 다음에, 5번째 줄에서 "".join(li)를 하는데요. 이는 문자 list를 문자열로 바꾸는 문장입니다.

 

 

 6번째 줄에 0번째 위치부터 4번째 위치까지 뽑으라고 하였으므로, 길이가 5인 부분 문자열이 출력됩니다.