이 튜토리얼에서는 리스트에 있는 여러 문자열 중 공통된 접두사(부분 문자열)를 가진 항목들을 하나로 묶는 프로그램을 작성해 보겠습니다. 먼저 예시를 통해 문제를 명확하게 이해해 보겠습니다.
입력 예시
strings = ['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript', 'python-1', 'python-2', 'javascript-1']
출력 결과
[['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript'], ['python-1', 'python-2'], ['javascript-1']]
문제 해결 접근 방식
이 문제는 itertools 모듈의 groupby 메서드를 사용하면 간단하게 해결할 수 있습니다. groupby 메서드는 비슷한 문자열들을 하나의 이터레이터 객체로 묶어주는 역할을 합니다. 주어진 리스트에서 하이픈(-)을 기준으로 문자열을 분리한 뒤, 첫 번째 부분을 groupby 메서드의 기준으로 전달하면 됩니다.
해결 단계
- 문자열 리스트를 초기화합니다.
- itertools 모듈을 임포트합니다.
- 결과를 담을 빈 리스트를 생성합니다.
- 문자열과 람다 함수를 itertools.groupby 메서드에 전달합니다.
- 람다 함수는 문자열을 하이픈(-)으로 분리한 후 첫 번째 부분을 반환해야 합니다.
- groupby 메서드는 요소와 해당 그룹으로 구성된 튜플들을 반환합니다.
- 각 반복마다 유사한 요소들의 그룹을 리스트로 변환합니다.
- 변환된 리스트를 빈 리스트에 추가합니다.
- 결과를 출력합니다.
전체 코드 예제
# itertools 모듈 임포트
import itertools
# 문자열 리스트 초기화
strings = ['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript', 'python-1', 'python-2', 'javascript-1']
# 결과를 저장할 빈 리스트
result = []
# 이터레이터 생성
# 람다 함수는 하이픈으로 분리한 문자열의 첫 번째 부분을 반환합니다.
iterator = itertools.groupby(strings, lambda string: string.split('-')[0])
# 결과 순회
# 요소와 해당 그룹을 함께 받아옵니다.
for element, group in iterator:
# 그룹을 리스트로 변환하여 결과에 추가
result.append(list(group))
# 결과 출력
print(result)실행 결과
위 코드를 실행하면 다음과 같은 출력을 확인할 수 있습니다.
[['tutorials-python', 'tutorials-c', 'tutorials-java', 'tutorials-javascript'], ['python-1', 'python-2'], ['javascript-1']]
동작 원리 살펴보기
groupby는 연속된 동일 키 값을 기준으로 데이터를 묶습니다. 따라서 정렬되지 않은 데이터에서 그룹화를 수행하려면, 사전에 sorted() 함수를 같은 키 기준으로 적용해 주는 것이 좋습니다. 위 예제에서는 'tutorials-'로 시작하는 문자열들이 앞쪽에 몰려 있기 때문에 별도의 정렬 없이도 올바른 결과가 나왔지만, 실무에서는 sorted(strings, key=lambda s: s.split('-')[0])처럼 정렬 후 그룹화하는 습관을 들이면 안전합니다.
마무리
이번 튜토리얼에서는 Python의 itertools.groupby를 활용해 리스트 내에서 공통 접두사를 가진 유사한 문자열들을 그룹화하는 방법을 배웠습니다. 이 기법은 로그 분석, 파일명 정리, 데이터 전처리 등 다양한 상황에서 유용하게 활용될 수 있습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.