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

파이썬으로 연속된 동일 문자 분할하기: itertools.groupby 완벽 가이드

문자열에 같은 문자가 여러 개 연달아 붙어 있을 때, 이를 개별 그룹으로 나눠야 하는 경우가 종종 있습니다. 예를 들어 '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), 로그 데이터 정규화, 텍스트 전처리 등 다양한 실무 상황에서 유용하게 활용됩니다.