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

Python으로 리스트에서 유사한 문자열 그룹화하기 – itertools.groupby 완벽 가이드

이 튜토리얼에서는 리스트에 있는 여러 문자열 중 공통된 접두사(부분 문자열)를 가진 항목들을 하나로 묶는 프로그램을 작성해 보겠습니다. 먼저 예시를 통해 문제를 명확하게 이해해 보겠습니다.

입력 예시

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를 활용해 리스트 내에서 공통 접두사를 가진 유사한 문자열들을 그룹화하는 방법을 배웠습니다. 이 기법은 로그 분석, 파일명 정리, 데이터 전처리 등 다양한 상황에서 유용하게 활용될 수 있습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.