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

Python에서 문자열을 동일한 길이로 분할하는 방법 – zip_longest(grouper) 완벽 가이드

이 튜토리얼에서는 주어진 문자열을 동일한 길이의 조각으로 분할하는 프로그램을 작성해 보겠습니다. 파이썬의 itertools 모듈에 있는 zip_longest 함수를 활용하면 몇 줄의 코드로 깔끔하게 해결할 수 있습니다. 먼저 예시를 살펴보겠습니다.

예시 1: 조각 길이가 5일 때

입력

string = 'Tutorialspoint'
each_part_length = 5

출력

Tutor ialsp ointX

예시 2: 조각 길이가 6일 때

입력

string = 'Tutorialspoint'
each_part_length = 6

출력

Tutori alspoi ntXXXX

두 번째 예시처럼 문자열의 길이가 조각 길이로 나누어 떨어지지 않으면, 남는 자리는 X 같은 채움 문자(fill value)로 메워집니다.

zip_longest 함수란?

itertools.zip_longest는 여러 개의 이터레이터(iterator)를 인자로 받아, 가장 긴 이터레이터가 소진될 때까지 순서대로 요소를 묶어 튜플을 반환하는 함수입니다. 짧은 이터레이터가 먼저 끝나면 fillvalue로 지정한 값이 그 자리를 대신 채웁니다.

여기에 한 가지 핵심 트릭이 더해집니다. 바로 [iter(string)] * n처럼 동일한 이터레이터에 대한 참조 n개를 만들어 전달하는 것입니다. 모든 참조가 같은 이터레이터를 가리키기 때문에, 각 튜플이 만들어질 때마다 문자열에서 문자가 차례대로 하나씩 꺼내지고, 결과적으로 문자열이 n글자씩 잘려 나가게 됩니다.

구현 코드

조각 길이 5인 경우

# itertools 모듈 임포트
import itertools

# 문자열과 조각 길이 초기화
string = 'Tutorialspoint'
each_part_length = 5

# 동일한 이터레이터에 대한 참조 n개 생성
iterator = [iter(string)] * each_part_length

# zip_longest로 문자열 분할
result = list(itertools.zip_longest(*iterator, fillvalue='X'))

# 튜플 리스트를 문자열로 변환하여 출력
print(' '.join([''.join(item) for item in result]))

실행 결과

Tutor ialsp ointX

조각 길이 6인 경우

# itertools 모듈 임포트
import itertools

# 문자열과 조각 길이 초기화
string = 'Tutorialspoint'
each_part_length = 6

# 동일한 이터레이터에 대한 참조 n개 생성
iterator = [iter(string)] * each_part_length

# zip_longest로 문자열 분할
result = list(itertools.zip_longest(*iterator, fillvalue='X'))

# 튜플 리스트를 문자열로 변환하여 출력
print(' '.join([''.join(item) for item in result]))

실행 결과

Tutori alspoi ntXXXX

코드 동작 원리 정리

  1. [iter(string)] * each_part_length로 하나의 이터레이터를 공유하는 참조 목록을 만듭니다.
  2. zip_longest(*iterator, fillvalue='X')가 각 반복마다 이터레이터에서 문자를 하나씩 가져와 튜플로 묶습니다. 이터레이터가 소진되면 'X'로 채웁니다.
  3. ''.join(item)으로 각 튜플을 하나의 문자열로 합치고, ' '.join(...)으로 조각들을 공백으로 구분해 최종 결과를 만듭니다.

마무리

이렇게 itertools.zip_longest와 이터레이터 참조 트릭만 알면, 복잡한 반복문 없이도 문자열을 원하는 길이로 손쉽게 분할할 수 있습니다. 이 패턴은 흔히 grouper 레시피라고 불리며, 데이터 청크(chunk) 처리에도 널리 활용됩니다. 튜토리얼 내용 중 궁금한 점이 있다면 댓글로 남겨주세요!