문자열에 같은 문자가 여러 개 연달아 붙어 있을 때, 이를 개별 그룹으로 나눠야 하는 경우가 종종 있습니다. 예를 들어 'pppyyytt'처럼 반복된 문자가 이어진 문자열을 ['ppp', 'yyy', 'tt'] 형태로 분리하는 것이죠. 이럴 때 파이썬의 itertools 모듈에서 제공하는 groupby 메서드와 문자열의 join 메서드를 함께 사용하면 아주 간단하게 해결할 수 있습니다.
예제 코드
다음은 연속된 동일 문자를 그룹별로 분할하는 전체 코드입니다.
from itertools import groupby
my_string = 'pppyyytthhhhhhhoooooonnn'
print("원본 문자열 :")
print(my_string)
my_result = ["".join(grp) for elem, grp in groupby(my_string)]
print("분할 결과 :")
print(my_result)실행 결과
원본 문자열 : pppyyytthhhhhhhoooooonnn 분할 결과 : ['ppp', 'yyy', 'tt', 'hhhhhhh', 'oooooo', 'nnn']
코드 설명
itertools모듈에서groupby함수를 임포트하여 환경에 불러옵니다.반복 문자가 포함된 문자열을 정의하고 콘솔에 출력합니다.
groupby는 문자열을 한 글자씩 순회하면서 연속해서 같은 값이 나오는 구간끼리 묶어주는 역할을 합니다. 이때 각 그룹은 (키, 그룹 객체) 형태로 반환됩니다.리스트 컴프리헨션 안에서
"".join(grp)를 사용해 각 그룹의 문자들을 하나의 문자열로 합친 뒤, 결과 전체를 리스트로 만들어 변수에 저장합니다.최종 분할 결과를 콘솔에 출력합니다.
groupby의 동작 원리
groupby는 데이터를 미리 정렬하지 않은 상태에서도 인접한 동일 요소만 묶어준다는 점이 특징입니다. 즉, 문자열에서 같은 문자가 중간에 끊겨 다시 등장하면 별개의 그룹으로 처리됩니다. 예를 들어 'aabaa'는 ['aa', 'b', 'aa']로 분할됩니다.
또한 elem 변수에는 각 그룹의 키(반복되는 문자)가 담기므로, 필요하다면 [elem * len(list(grp)) ...] 방식이나 len()을 활용해 각 그룹의 반복 횟수를 세는 것도 가능합니다. 이 기법은 문자열 압축(run-length encoding), 로그 데이터 정규화, 텍스트 전처리 등 다양한 실무 상황에서 유용하게 활용됩니다.